• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA 別のシートから文字列参照して全て表示)

VBAで別のシートから文字列参照して表示

このQ&Aのポイント
  • ExcelのVBAで、別のシートから文字列を参照して表示する方法について説明します。
  • VBAを使用して、Sheet1のA3セルに入力された5文字の文字列と、Sheet2のC列にある文字列が一致するデータを探し、Sheet2のD列を含めてSheet1のA5から下に表示させる方法について説明します。
  • 条件に一致するデータが見つかった場合は、Sheet1のA5には一致するデータの1つ目、B5には2つ目、C5には3つ目のデータが表示されます。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.6

C列で見つかればC,D列をSheet1のA5,B5から下にすべて表示 と Sheet2のB列にあるデータ(C列のデータに同期したデータ)をSheet1のB列に同じ様に表示する B列が重複してますので、とりあえずSheet2のB列のデータ(C列のデータに同期したデータ)をSheet1のC列に表示します。 一部訂正: A3が空白の時に変な結果が出るので空白の時は実行しないようにしました。 また、最初にA5:C5以下を消してから実行するようにしました。 > 例えば(abcde)と入力してみたのですがabcdeから始まる文字列ではなくすべてのデータが表示されました。 こちらでそのような結果がでないので原因がわかりませんから Debug.Print "A3="; SData; ; " : 位置="; VRet; " : 対象="; CStr(c.Value) でイミディエイトウィンドウにそれぞれの値が表示されるようにしてます。それでそれぞれがどうなっているか確認してみてください。 Sub Test2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As String, i As Long, VRet As Variant Dim c As Range, LastRow As Long Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = CStr(Ws1.Range("A3").Value) If SData = "" Then Exit Sub i = 5 LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row If LastRow < i Then LastRow = i End If Ws1.Range(Ws1.Cells(i, "A"), Ws1.Cells(LastRow, "C")).ClearContents With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) VRet = InStr(1, CStr(c.Value), SData, vbTextCompare) Debug.Print "A3="; SData; ; " : 位置="; VRet; " : 対象="; CStr(c.Value) If VRet = 1 And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value 'とりあえずSheet2のB列のデータ(C列のデータに同期したデータ)をSheet1のC列に Ws1.Cells(i, "C").Value = .Cells(c.Row, "B").Value i = i + 1 End If Next End With End Sub

その他の回答 (5)

  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.5

コードがデタラメ過ぎて何が何やら…… AdvancedFilterで抽出すればいいのでは?

  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.4

最初、見たことない、こんな命令あるのか、と思ってやってみたら、エラーになりました。 オートフィルターを使う方法もあります。 Option Explicit ' Sub Macro1()   Dim I As Worksheet   Dim REnd As Long '   Sheets("Sheet1").Select   Set I = Sheets("Sheet2")   I.AutoFilterMode = False   REnd = I.Cells(Rows.Count, "C").End(xlUp).Row   Application.ScreenUpdating = False   Range("A5:B" & Rows.Count).ClearContents   I.Range("C2:D" & REnd).AutoFilter 1, [A3] & "*"   I.Range("C3:D" & REnd).Copy [A5]   I.AutoFilterMode = False End Sub

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.3

> 文字の文字列(大文字、小文字を区別しない) これがA3の文字列が大文字でも小文字でも検索先(Sheet2のC列)では大文字小文字を区別しないでしたら 文字列を含む場合は If VRet > 0 And Len(c.Value) >= 10 Then Sub Test1() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As String, i As Long, VRet As Variant Dim c As Range Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = CStr(Ws1.Range("A3").Value) i = 5 With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) VRet = InStr(1, CStr(c.Value), SData, vbTextCompare) If VRet = 1 And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value i = i + 1 End If Next End With End Sub

chi_ko6262
質問者

補足

ご回答ありがとうございます。 試しに実行してみましたが、例えば(abcde)と入力してみたのですがabcdeから始まる文字列ではなくすべてのデータが表示されました。 大変申し訳ございませんが、再度ご知恵を頂けますと幸いです。 付帯してお知恵を拝借させて頂きたいのですが、Sheet2のB列にあるデータ(C列のデータに同期したデータ)をSheet1のB列に同じ様に表示する事は出来ますか? 何卒宜しくお願い致します。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

No1の補足です。 A3に12345のような数値でも検索する場合 以下に変更してください。 SData = Ws1.Range("A3").Value & "*" を SData = CStr(Ws1.Range("A3").Value) & "*" If c.Value Like SData And Len(c.Value) >= 10 Then を If CStr(c.Value) Like SData And Len(c.Value) >= 10 Then

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

> A3の文字列から始まるデータ(10文字以上) 始まり10文字以上のデータですよね。 含むでしたら以下に変更してください。 SData = "*" & Ws1.Range("A3").Value & "*" Sub Test() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As Variant, i As Long Dim c As Range Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = Ws1.Range("A3").Value & "*" i = 5 With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) If c.Value Like SData And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value i = i + 1 End If Next End With End Sub

関連するQ&A