選択したセルの値を別シートのセルに取り込む方法

このQ&Aのポイント
  • Excel VBAを使用して、選択したセルの値を別のシートのセルに取り込む方法について教えてください。
  • 具体的には、顧客情報が入力されたデータベースシートと、顧客情報を表示するためのフォームシートがあります。選択したセルの行に「出力」と入力すると、その行の値を別のシートに渡すようにしたいです。
  • また、Excelの関数(match、indexなど)を使用して、選択したセルの値を別のシートの特定のセルに渡す方法も教えてください。
回答を見る
  • ベストアンサー

選択したセルの値を別シートのセルに取り込む方法

顧客情報を閲覧・印刷するためのフォームがsheet1とします。顧客の情報が入ったデータベースがsheet2とします。 以下のマクロでsheet2の48列目を空欄にして、48列のいずれかのセルに「出力」と入力すると、そのセルの行の値を出力結果というシートに渡すようにしています。取り込んだ行の顧客番号をsheet1のmach関数の参照先に指定して、index関数で各項目に取り込むようにしています。 Worksheets("sheet2").Activate Dim i, LastRow As Long LastRow = Cells(Rows.Count, 48).End(xlUp).Row For i = 1 To LastRow If Cells(i, 48) = "出力" Then Rows(i).Copy Sheets("出力結果").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i もう少しこれを改良して、Sheet2の顧客番号の入っている1列目の任意のセルを選択して、sheet1のmatch関数の参照先(例としてK4)に選択した顧客番号を渡す方法はありませんでしょうか。sheet1は顧客番号だけ取得できれば、match・index関数でフォームが完成します。 VBAは初心者です。上記マクロは検索で調べて必要な個所をコピーして今の環境にアレンジしました。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

>sheet1のmach関数の参照先 がsheet1のどのセルに表示される様になっているのか何も説明がないため、 >取り込んだ行の顧客番号をsheet1のmach関数の参照先に指定して、index関数で各項目に取り込む >sheet1のmatch関数の参照先(例としてK4)に選択した顧客番号を渡す方法 と仰られてもさっぱり解りませんし、質問者様のご説明内容と、質問者様が作られたVBAでは結果を出力するためのシートが異なるシート名のシートとなっているために、結果を出力するためのシートがsheet1なのか、それとも「出力結果」というシート名のシートなのか判りませんので、質問者様が何をどうしたいのかという事が今一つ不明瞭なのですが、取りあえず、 >取り込んだ行の顧客番号をsheet1のmach関数の参照先に指定して、index関数で >sheet1のmatch関数の参照先(例としてK4)に選択した顧客番号を渡す方法はありませんでしょうか。sheet1は顧客番号だけ取得できれば、match・index関数でフォームが完成 という箇所は無視して、 >Sheet2の顧客番号の入っている1列目の任意のセルを選択 してから、マクロを起動させると、Sheet2上で選択されているセルと同じ行にあるA列のセルに入力されている顧客番号と同じ顧客番号の行のデータを、すべて「出力結果」というシート名のシートにコピーしてしまうという事で宜しいのでしょうか?  それで宜しければ以下の様になります。  今仮に、Sheet2の3行目は各列の項目の項目名が入力されていて、実際の顧客番号等のデータは4行目以下に入力されているものとします。  その場合、以下の様なVBAとなります。 Sub QNo9267513_選択したセルの値を別シートのセルに取り込む方法() Const CopySheetName As String = "Sheet2" '元データシートのシート名 Const PasteSheetName As String = "出力結果" '転記先シートのシート名 Const CustomerNumColumn As String = "A" '顧客番号が入力されている列の列番号 Const ItemRow As Long = 3 '項目名が入力されている行の行番号 Dim CopySheet As Worksheet, PasteSheet As Worksheet, LastRow As Long _ , i As Long, c As Range, TargetValue As Variant, CopyRange As Range For i = 0 To 1 If IsError(Evaluate("ROW('" & Array(CopySheetName, PasteSheetName)(i) & "'!A1)")) Then MsgBox Array("元データが入力されている", "抽出結果を出力するための")(i) _ & "シートとして設定されている" & vbCrLf & vbCrLf _ & Array(CopySheetName, PasteSheetName)(i) & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Next i Set CopySheet = Sheets(CopySheetName) Set PasteSheet = Sheets(PasteSheetName) With CopySheet LastRow = .Range(CustomerNumColumn & .Rows.Count).End(xlUp).row .Activate TargetValue = .Range(CustomerNumColumn & ActiveCell.row).Value If LastRow <= ItemRow Or TargetValue = "" Or WorksheetFunction _ .CountIf(.Range(CustomerNumColumn & ItemRow + 1 & ":" _ & CustomerNumColumn & LastRow), TargetValue) = 0 Then MsgBox "処理すべきデータがありません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If Set CopyRange = .Range("1:" & ItemRow) End With With Application .ScreenUpdating = False .Calculation = xlManual End With For Each c In CopySheet.Range(CustomerNumColumn _ & ItemRow + 1 & ":" & CustomerNumColumn & LastRow) If c.Value = TargetValue Then Set CopyRange = Union(CopyRange, c) Next c Set CopyRange = CopyRange.EntireRow With PasteSheet .Activate .Cells.Clear CopyRange.Copy With .Cells(1, 1) .PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone _ , SkipBlanks:=False, Transpose:=False .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteValues End With End With With Application .CutCopyMode = False .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub

shibushijuko
質問者

お礼

ご回答いただき、ありがとうございます。 説明が下手で申し訳ございません。実際にどんなシートがあり、関数はどのように使っているか、詳細に説明すべきでした。今度から質問するときは、詳細に書くようにします。 上記マクロを実際に検証しました。sheet2のA列の任意のセルを選択してマクロを実行、出力結果シートに移動すると4行目に選択行のすべてのデータが取り込まれました。 このマクロのすべての意味を理解するには、マクロを勉強するしかないのですが、必要な個所をカスタマイズして今後に役立てたいと思います。 顧客情報を表示するフォーム上に、データ情報の入った別シートの選択したデータ行の番号を取得したいだけでした。 ネットで調べているうちに以下のマクロ文を見つけました。これで、AY1の値を入力フォームのK4が参照表示する(=sheet2!AY1)ようにして、K4に表示された行の数字をもとに、index関数で各項目を取得できるようになりました。 データ情報の入ったsheet2は行数がたくさんあるので、1行目を固定して、マクロボタンも1行目に置きました。後はエクセルのフィルター機能 を使って、必要な行を見つけ出せばいいようにしました。 Sub 行番号取得() ActiveSheet.Range("AY1") = ActiveCell.Row End Sub 上記マクロでmatch関数は不要になりました。有難うございます。

その他の回答 (2)

回答No.3

エクセルでやるべき作業ではないような気もしますが(汗 まぁ、アクセスとか使える環境のほうが少ないか、ってことで。 単純ではありますが、仕立てようによってはやや面倒な話題ではあります。 例えばおっしゃるように > Sheet2の顧客番号の入っている1列目の任意のセルを選択して とするこのももちろん可能です。 が、これだと「動かしたくないのに」シート移動してしまうケースもあります。 同様にダブルクリックすると、なんてタイミングでも作成可能ですが、 これもまた予期せぬタイミングで処理が走る可能性がありますから、 個人的にはお勧めしません。 セルの値を編集するときにダブルクリックする方が圧倒的に多いので。 なので私個人としては 「選択しているセルの1列目(A列)の値を他のセルに送るマクロを仕込んだボタン」 を実装することをお勧めします。 単に Sub Sample()     Worksheets("Sheet1").Range("K4") = Cells(Selection.Row, 1)     Worksheets("Sheet1").Select     Range("K4").Select End Sub これだけのマクロです。 これをボタンに仕込んで、画面の上の方のどこかに配置、 スクロールしてもボタンが消えないように、 ウィンドウ枠の固定をしてやって準備完了です。 ActivateとかSelectionChangeとかBeforeDoubleClickのタイミングは便利ではありますが エラー処理や例外処理などを仕込んでおかないと予期せぬ動きをします。 ご注意くださいませ。 お節介ながら、ご質問中でご提示のマクロ。 > sheet2の「48列目を空欄にして」、48列のいずれかのセルに「出力」と入力 とのことですから、出力したいタイミングだと 「出力(にこだわらず、何か)」が入力されているセルは、 48列目には一カ所しかない、と考えられます。 この推察が正しければ、ここももっと単純に処理が可能です。 例えば、タイミングが適切かどうかは置いておいて、     Worksheets("sheet2").Activate     Rows(Cells(1, 48).End(XlDown).Row).Copy Sheets("出力結果").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) このような具合に、ご呈示の8行を2行に書き換えが可能です。 For~Next で回す必要は無さそうですね。 以上、ご参考までに。

  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.1

セルがある場所の値は、 Selection.value で得られますので、 Selelction.Copy Sheets("出力結果").Range("K4") とかでコピーできちゃいますが・・・。

shibushijuko
質問者

お礼

ご回答ありがとうございます。 データ情報のあるシート上でデータ情報の最終列AY1に任意に選択したセルの行番号が出るマクロを作りました。 Sub 行番号取得() ActiveSheet.Range("AY1") = ActiveCell.Row End Sub 後は、AY1の値を顧客情報を表示するフォームの適当な見えないところに取り込み、問題解決しました。フォームはmatch関数が不要になり、index関数のみで済みました。 上記マクロはネット検索でなんとか調べて、アレンジしました。たった一行のマクロ文で済むことを知り、VBAを基本から勉強しないといけないと痛感しました。今現在は時間が無いため、必要な個所だけコピペして使いまわす方法をとってます。

関連するQ&A

  • マクロで複数の行をまとめて切り取りする方法

    Iの列のセルに「テスト」があったら、その行を切り取ってシート2に貼り付ける といった流れのコードが下記です。 Sub 切り取り() Dim i, LastRow As Long LastRow = Cells(Rows.Count, 9).End(xlUp).Row For i = 1 To LastRow If Cells(i, 9) = “テスト” Then Rows(i).Cut Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub ●Iの列のセルに「テスト」と「課題」があったら、その行を切り取ってシート2に貼り付ける といったものをしたいのです。 1. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト,課題” Then 結果エラー 2. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト&課題” Then 結果エラー 正常なコードを教えてくださいますか? 宜しくお願いします。

  • Excel 2007 マクロ 別シートの情報を反映する方法

    Excel 2007 マクロ 別シートの情報を反映する方法 Sheet1とSheet2があります。 Sheet1のD列とSheet2のM列で同じ値があれば、 Sheet1のE列の値をSheet2のN列に反映するマクロを 作成しました。 下記が正しいと思っていたのですが、エラーメッセージは出ずに 値が反映されません。 マクロに問題点があればご指摘ください。 よろしくお願いいたします。 Sub Rist() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") For i = 2 To ws1.Cells(Rows.Count, "D").End(xlUp).Row For j = 2 To ws2.Cells(Rows.Count, "M").End(xlUp).Row If ws2.Cells(j, "M") = ws1.Cells(i, "D") Then ws2.Cells(j, "N") = ws1.Cells(i, "E") End If Next j Next i End Sub

  • マクロ 行を切り取ってペーストでエラーになる

    J列に「0」と「#N/A」の行を切り取って集計対象外シートに貼り付けるといったコードです。 何故か途中でエラーになります。 どこが間違っておりますか? 宜しくお願いします。 Dim LastRow As Long LastRow = Cells(Rows.Count, 10).End(xlUp).Row For i = 1 To LastRow If Cells(i, 10) = "0" Or Cells(i, 10) = "#N/A" Then Rows(i).Cut Sheets("集計対象外").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i

  • 別bookのセルを参照するにはどうしたらよいでしょうか

    Next Forを使用したマクロで、そのNext For構文内で、別ブックのセルを参照したいのですが、どうしたらよいでしょうか。 下記のように作成してみたのですが、テストしてみると、同ブック同シートの該当セルを参照しているようで、機能しません。下記の書き方では間違っているのでしょうね・・・。 マクロ初心者で、とても初歩的な質問で申し訳ないのですが、教えていただきたく質問させていただきました。よろしくお願いします。 必要なブックは開いている状態です。 Cells(i,_)はbook1・シート"AAA"のi行・_列目を参照し、 Cells(n,_)はbook2・シート"BBB"のn行・_列目を参照し、 Cells(s,_)はbook2・シート"BBB"のセルを参照してほしいのですが・・・。 (1) book1・シート"AAA"のi行18列目のセルとbook2・シート"BBB"のn行・1列目の値が同じであれば (2) (book2・シート"BBB"のn行・1列目)の1行下をs行目としてs行・4列目のセルとbook1・シート"AAA"のi行28列目のセルが同値であれば (3) s行4列目からs行9列目を”ClearContents”するという内容です。下記のマクロは全て記述しておりませんが、ここが間違っているのは確実だと思います。今後の勉強にも是非生かしていきたいと思っておりますので、どうぞよろしくお願いいたします。 Sub test01() Dim n As Long Dim i As Long Dim s As Long For i = 6 To Workbooks("book1.xlsx").Worksheets("AAA").Cells(Rows.Count, 16).End(xlUp).Row If Cells(i, 16) = "" Then Exit For Else For n = 4 To Workbooks("book2.xlsx").Worksheets("BBB").Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 16) <> "" And Cells(i, 18).Value = Cells(n, 1).Value Then For s = n + 1 To Workbooks("book2.xlsx").Worksheets("BBB").Cells(Rows.Count, 4).End(xlUp).Row If Cells(s, 1) <> "" Then Exit For ElseIf ..............

  • excelマクロの重複セルの削除について

    excelマクロ超初心者です。 E列に下記のようにデータが入っていたとします。   E列 1 いちご 2 りんご 3 みかん 4 いちご 5 りんご 6 れもん これを重複セルを削除して   E列 1 いちご 2 りんご 3 みかん 4 れもん としたいのですが、どうすればいいでしょうか? 自分なりに調べて、下記のように記述したのですが、 Sub test() lastRow = wb.Sheets("Sheet1").Range("E" & Rows.Count).End(xlUp).Row 'E列最終行 For i = lastRow To 2 Step -1 If Cells(i, 5).Value = Cells(i - 1, 5).Value Then Cells(i, 5).EntireRow.Delete Shift:=xlUp End If Next i End Sub() E4列から下のデータしか重複セルが削除されません。 ここでいうlastRow To 2 Step -1はどういう意味なのでしょうか? すみませんが宜しくお願いします。

  • VBAのスピードについてご教示ください

    下記マクロは、シートAに氏名、郵便番号、住所・・・、と横に住所録を整理していて、列11番目に「対象」と入力されている行を順番にコピーして、シート「送付先一覧」に貼り付けるマクロをコピーしてエクセル2010で使用させていただいてるのですが、職場のエクセル2007では極端にスピードが遅くなります。 エクセル2007では、2010のように早くはならないのでしょうか? 2007を使用してるパソコンが、少し古いからでしょうか? 素人でよくわかりません。 遅くなる理由、また早くする方法があればご教示ください。 Sub 対象抽出() Dim i, LastRow As Long LastRow = Cells(Rows.count, 11).End(xlUp).Row For i = 1 To LastRow If Cells(i, 11) = "対象" Then Rows(i).Copy Sheets("送付先一覧").Cells(Rows.count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub

  • 別シートにコピペするExcelVBA

    超初心者なのですが、業務処理の簡素化のため、色々調べながら、下記を作りました。 が、、、うまく動いてくれません。。 やりたいことは、D列に「OK」とある行を、「終了リスト」というSheetにコピーし、コピーした行を削除。 その処理の前に、メッセージボックスで処理を進めて問題ないか確認する。。。です。 メッセージボックスでの処理分岐を入れようとして、色々記述を変えたところ、エラーになってしまいました。。。 どなたか、お詳しい方がいらっしゃいましたら、誤っている箇所をご指摘、ご教授いただけないでしょうか。 それから、もし可能であれば件数が0件の場合は、「対象なし」と表示したいです。 どうぞ宜しくお願いいたします。 Sub 終了処理() Dim cnt As Long Dim chk As Integer Dim i, LastRow As Long Dim myMsg1 As String, myMsg2 As String myMsg1 = "終了件数は" myMsg2 = "件です。完了しますか?" cnt = WorksheetFunction.CountIf(ActiveSheet.Range("A3:A65536"), "OK") chk = MsgBox(myMsg1, cnt, myMsg2, vbYesNo) If chk = vbYes Then LastRow = Cells(Rows.Count, 4).End(xlUp).Row For i = 1 To LastRow If Cells(i, 4) = "OK" Then Rows(i).Copy Sheets("終了リスト").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Rows(i).Delete shift:=xlUp Next i End If End Sub どうぞ宜しくお願いいたします。

  • エクセル VBA 特定文字がある行を別シートに移動

    ソフト excel2003 o列に文字列が入力された表があります。 マクロ実行時下記のようにするには、VBAのコードをどのように記入すればよろしいでしょうか? 赤枠で囲んだボタンをクリックすると シート1のO列に 中 が入力されている行を切り取りし中シートに貼り付け (下の行は上方向にシフト) ※ シート1の内容は日毎に更新されますので、更新後、赤枠で囲んだボタンをクリックするとその時点で 中 が入力されているものは中シートのリストへ追加されるようにしたいのです。 以前ここで教えていただいたものを参考に作成してみたの(以下に記載)ですがうまくいきません。 お助けいただけないでしょうか。 宜しくお願い致します。 Sub ボタン中シート_Click() 'Sheet2の挿入位置(C列は結合セルではなく、必ず何か入っている事) nMax2 = Sheets("中シート").Cells(Rows.Count, 3).End(xlUp).Row + 1 With Sheets("sheet1") nMax1 = .Cells(Rows.Count, 9).End(xlUp).Row For i = nMax1 To 2 Step -2 If .Cells(o, 15) = "中" Then .Range(.Cells(o, 1), .Cells(o + 1, 10)).Copy Sheets("中シート").Cells(nMax2, 1).Insert Shift:=xlDown .Range(.Cells(o, 1), .Cells(o + 1, 10)).Delete Shift:=xlUp End If Next i End With End Sub

  • セルを結合するマクロ

    マクロ初心者です。 Aセルをブランク領域で選択してマクロを実行しますとセルが結合します。 最後の空白がどこまでかは、何か指定がないといけないので、仮にエンドと名付けます。 このコードはA列のみです。A列からM列またはL列までと指定するにはどうすれば良いですか? ご教鞭をお願いします。 Sub test() Set Rng = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)) Set blanks = Rng.SpecialCells(xlCellTypeBlanks) For Each ar In blanks.Areas Union(ar(1).Offset(-1), ar).Merge Next Cells(Rows.Count, 1).End(xlUp).ClearContents End Sub

  • excel 空白のセルがある行を削除するマクロ

    A列に、みかん りんご バナナ 肉 などと入力されており、 B1に=if(countif(A1,"*みかん*")+countif(A1,"*りんご*")+countif(A1,"*バナナ*"),"fruit","") という感じで、fruit か 空白 を返す関数が入力されており、オートフィルでB列に数式をコピーするマクロを実行します。 その次に、B列で空白のセルがある場合、その行を削除するというマクロを下記のように入力しましたが、削除されません。 Dim lastRow As Long Dim i As Long lastRow =Range("B"&Rows.count).End(xlup).Row For i =lastRow To 5 Step -1 If Cells(i,"B").Value="" Then Rows(i).Delete XlShiftUp End If Next i 間違いをどなたか教えてください。 ちなみに、B列が関数では無く、ただの文字列の場合("fruit")ではマクロが実行できました。 関数の値からマクロを実行することは不可能なのでしょうか? 解答、宜しくお願い致します。

専門家に質問してみよう