No.7ベストアンサー
- 回答日時:
複数列対応版です。
-----------------------------------------------------------------------
名前を入力する方のシートモジュールに以下のコードを
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Private Sub Worksheet_Change(ByVal Target As Range)
Dim 名前 As String
If Target.Column <> 1 Then Exit Sub
名前 = Trim(Target.Text)
If 名前 = "" Then Exit Sub
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Call データ貼付(ActiveSheet.Name, Target.Row, StrConv(名前, vbWide))
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
-----------------------------------------------------------------------
標準モジュールに以下のコードを
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Sub データ貼付(シート As String, 元行 As Long, 名前 As String)
Dim 参照行 As Long
Dim 行 As Long
Dim 列 As Long
Dim 最終列 As Long
With Sheets("Sheet1")
最終列 = .UsedRange.Columns(.Columns.Count).Column
For 参照行 = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
If 名前 = StrConv(Trim(.Cells(参照行, 1).Text), vbWide) Then
行 = 参照行
Do While .Cells(行, 2).Text <> ""
For 列 = 2 To 最終列
Sheets(シート).Cells(元行, 列).Value = .Cells(行, 列).Text
Next
行 = 行 + 1
元行 = 元行 + 1
Loop
Exit Sub
End If
Next
End With
End Sub
-----------------------------------------------------------------------
※ 行がかなり有るという事で多少スピードアップも図っています。(無くても動きます)
①「Application.EnableEvents = False」~「Application.EnableEvents = True」【イベント割り込みを一時停止しています】
②「Application.Calculation = xlCalculationManual」~「Application.Calculation = xlCalculationAutomatic」【自動計算を一時停止しています】
③「Application.ScreenUpdating = False」~「Application.ScreenUpdating = True」【表示書き換えを一時停止しています】
No.6
- 回答日時:
No.5 の追補
意味がうまく伝わっていなかったようなので具体的な図をしめします。
たとえば「斎藤 次郎」と入力したときに黄緑で塗りつぶした部分だけならばほんの少しの改良で出来るのですが、B列よりC列の方が伸びてしまっているので「2012/4/8長男誕生」が反映されません。
完璧にやるとしたら赤枠で囲っている部分(次の名前の行の前まで)をコピーしないといけないのですが、最終データの処理が割と面倒なので、はみ出すデータが無いかの確認がしたかったのです。
No.4
- 回答日時:
マクロ(VBA)での回答です。
-----------------------------------------------------------------------
名前を入力する方のシートモジュールに以下のコードを
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Private Sub Worksheet_Change(ByVal Target As Range)
Dim 名前 As String
If Target.Column <> 1 Then Exit Sub
名前 = Trim(Target.Text)
If 名前 = "" Then Exit Sub
Call データ貼付(ActiveSheet.Name, Target.Row, StrConv(名前, vbWide))
End Sub
-----------------------------------------------------------------------
標準モジュールに以下のコードを
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Sub データ貼付(シート As String, 元行 As Long, 名前 As String)
Dim 参照行 As Long
Dim 行 As Long
With Sheets("Sheet1")
For 参照行 = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
If 名前 = StrConv(Trim(.Cells(参照行, 1).Text), vbWide) Then
行 = 参照行
Do While .Cells(行, 2).Text <> ""
Sheets(シート).Cells(元行, 2).Value = .Cells(行, 2).Text
行 = 行 + 1
元行 = 元行 + 1
Loop
Exit Sub
End If
Next
End With
End Sub
-----------------------------------------------------------------------
※ 対象のシートモジュールへのコード記入はプロジェクトの対象のシートをクリックして開いた所に記入して下さい。標準モジュールではありません。
※ 苗字と名前の間のスペースが全角であったり半角であったりしそうなので、一度全角にした上で比較しています。(半角・全角は気にしなくて良くなっています)
この回答へのお礼
お礼日時:2017/02/23 10:44
おおおお!
これはすごい!!
やりたかったことそのままです!
教えていただきありがとうございます。
わがままを言うのですが、もし代入したいセルが増えた場合(C列、D列、E列…)と
増えた場合とかも対応はできるのでしょうか?
教えて頂けたら助かります…
No.3
- 回答日時:
まず作業列をCに作ります。
あと1行目は空けておいてください。
また、表示されたデータの最終行の次は空白行にしてください。
つまりA2で検索した結果がB2~B4に表示された場合、A5は空白とし、
A6以降で次の検索。
C2=IF(A2="",IF(B2="","",C1+1),MATCH(A2,sheet1!A:A,FALSE)+1)
これにより、A2およびB2が空白であれば空白、
A2は空白でB2にデータがある場合、上のセルに1加えたものを表示、
A2自体にデータが入力されている場合、「sheet1のA列で該当する行番号に1加えたもの」を表示。
B2=IF(C1="",IF(A2="","",VLOOKUP(A2,sheet1!A:B,2,FALSE)),IF(INDIRECT("sheet1!B"&C1)="","",INDIRECT("sheet1!B"&C1)))
これにより
C1とA2が空白なら空白、
C1は空白(つまり上の行にはデータが無い)で、A2が空白でない(つまり検索データが入力された)場合、A2をsheet1のA列で検索し、該当した行のB列のデータを表示する。
C1自体にデータがある(つまり上の行には何かしら検索データが表示されている)場合、
sheet1のB列で「行番号がC1に表示されている数字」のセルにあるデータを表示する。
(該当セルのデータが空白の場合0となるので、IF(~="","",~)として、空白の場合も空白にしている)
これらB,Cを必要な行数コピーする。
A2が「鈴木 三郎」の場合で確かめると、
B2はC1が空白で、A2は空白ではないので、A2を検索し、B列の「山梨県出身」と表示する。
C2はA2が空白ではないので、A2の位置を検索し、9+1=「10」と表示する。
B3はC2が空白ではないので、C2に表示された10により、B10の「23歳」と表示する。
C3はA3が空白で、B3は空白ではないので、C2に表示された10に1加え、「11」と表示する。
B4は同様にB11の「バツイチ」と表示する。
C4は同様に11に1加え「12」と表示する。
B5は同様にB12だが、空白なので空白とする。
C5はA5もB5も空白なので、空白とする。
B6はC5が空白なので、A6にデータがあれば検索し、なければ空白とする。
…
といった流れになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) excelで検索した商品の画像(ネットワーク上の)を表示させたい。 3 2023/06/28 00:32
- Excel(エクセル) エクセルで日付が入っているセルを一定の法則に従って違うセルに表示したい 2 2022/04/04 17:16
- Excel(エクセル) Excel関数 情報引用する方法 4 2022/07/31 20:59
- Excel(エクセル) 【エクセル」 特定のセルで条件抽出した列を、別シートに上から詰めて表示したい。 8 2022/04/08 16:00
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Word(ワード) Word2013 縦書き上下二段の表、改行を続けると次ページに情報が表示されるようにしたい 3 2022/06/16 09:24
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Excel(エクセル) Excel セルに入っている日付を参照して、別シートのリストを表示させたい 1 2022/04/12 17:02
- Excel(エクセル) 別シートの表の値を参照したい 2 2022/03/30 15:11
- Visual Basic(VBA) エクセルについて教えてください。 3 2023/06/28 09:11
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで行の高さ及び列幅の...
-
Excel2017 フィルタ昇順並びがA...
-
EXCEL 最終行のデータを他のセ...
-
【Excel VBA】指定した行の最大...
-
オートフィルタ後のデータから...
-
VBA 複数行の検索及び抽出
-
基準日以前のデータを範囲を指...
-
Excelで並び替え後にア行...
-
エクセル関数のSUMPRODUCTにつ...
-
【Excel】数式の参照範囲を可変...
-
急ぎ!色のついたセルを非表示...
-
エクセルで、ある列の共通する...
-
EXCELで日付を比べ3か月以内の...
-
文字列を比較し、相違するフォ...
-
エクセルの時刻のカウントが出...
-
エクセル関数について
-
EXCELで一個飛びに足す関数は?
-
エクセル マクロで行の合計を...
-
複数回答のクロス集計の方法
-
マクロで行の高さを設定したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel2017 フィルタ昇順並びがA...
-
Excelで並び替え後にア行...
-
エクセルで行の高さ及び列幅の...
-
オートフィルタ後のデータから...
-
急ぎ!色のついたセルを非表示...
-
エクセルの時刻のカウントが出...
-
【Excel VBA】指定した行の最大...
-
基準日以前のデータを範囲を指...
-
平均変化率の信頼区間
-
エクセル VBA 行間隔を飛ばした...
-
文字列を比較し、相違するフォ...
-
プルダウンに【なし、平均、デ...
-
EXCEL 最終行のデータを他のセ...
-
excel / ピポッド 日数を出したい
-
EXCELで日付を比べ3か月以内の...
-
VBA 複数行の検索及び抽出
-
エクセル関数について
-
複数回答のクロス集計の方法
-
マクロで行の高さを設定したい
-
エクセル関数のSUMPRODUCTにつ...
おすすめ情報