🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1335閲覧

【条件式】テーブルのヘッダーが配列に該当するとき処理開始

Dis

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/03/20 01:42

VBA

1Sub date0320() 2 3 Dim filePath As Variant 4 5 filePath = Application.GetOpenFilename( _ 6 FileFilter:="Excelブック(*.xlsx;*.xlsm;*.xls;*.csv),*.xlsx; *.xlsm; *.xls; *.csv;", MultiSelect:=True) 7 8' Application.DisplayAlerts = False '大量データのコピー時、注意ダイアログ出るときあるのでオフに 9' Application.ScreenUpdating = False 'チラつきをオフに 10 11 12 '配列を取得-------------------------------------------------------------- 13 Dim bufArray1 As Variant 14 Dim MyArray1 As Variant 15 16 bufArray1 = Range("B6:S6") 17 MyArray1 = WorksheetFunction.Index(bufArray1, 1, 0) 'MyArray1(1)~MyArray(18)まで要素が入っている 18 ReDim Preserve MyArray1(17) 'MyArray1(1)から始まるのが嫌なのでRedimしてMyArray(0)~MyArray(17)に 19 20 21 'テーブル用シートの作成-------------------------------------------------------------- 22 Dim ws As Worksheet 'Sheets("T_送信") 23 Dim ws2 As Worksheet 'Sheets("送信") 24 25 Worksheets.Add after:=Worksheets("送信") 26 With ActiveSheet 27 .Select 28 .Name = "T_送信" 29 End With 30 Set ws = ThisWorkbook.Sheets("T_送信") 31 Set ws2 = ThisWorkbook.Sheets("送信") 32 33 34 'ループ処理-------------------------------------------------------------- 35 Dim i As Long 36 Dim r As Long 37 Dim wb As Workbook 38 Dim LastRow1 As Long 39 Dim FoundCell As Range 40 41 For i = LBound(filePath) To UBound(filePath) 42 Set wb = Workbooks.Open(filePath(i)) 43 44 'wbのデータをsheets("T_送信")をコピー-------------------------------------------------------------- 45 LastRow1 = wb.Sheets(1).Cells(Rows.Count, 2).End(xlUp).row '最終行の取得(コピー側) 46 wb.Sheets(1).Range("B4:X" & LastRow1).Copy 'タイトル行を除きコピー 47 ws.Cells(2, 2).PasteSpecial xlPasteValues '貼り付け 48 Application.CutCopyMode = False 49 ws.Activate 50 ws.Range("B2").Select 51 52 'sheets("T_送信")をテーブル化-------------------------------------------------------------- 53 With ws 54 .Activate 55 .Range("B2").Select 'selecetメソッドが被っているように見えるがなぜかこうしないとエラーでる 56 .ListObjects.Add(xlSrcRange, Selection.CurrentRegion, , xlYes).Name = "T_送信" 57 .Range("B2").ListObject.TableStyle = "" '無地のテーブルへ 58 End With 59 60 'sheets("送信")をテーブル化-------------------------------------------------------------- ’sheets("送信")もテーブル化することでペーストが簡単にできる 61 With ws2 62 .Activate 63 .Range("B6").Select 'selecetメソッドが被っているように見えるがなぜかこうしないとエラーでる 64 .ListObjects.Add(xlSrcRange, Selection.CurrentRegion, , xlYes).Name = "送信" 65 .Range("B6").ListObject.TableStyle = "" '無地のテーブルへ 66 End With 67 68 'sheets("T_送信")をデータをsheets("送信")へコピー-------------------------------------------------------------- 69 For r = LBound(MyArray1) To UBound(MyArray1) 70 If ws2.Range("B2").ListObject.ListColumns(MyArray1(r)).HeaderRowRange = MyArray1 Then 71 With ws2 72 .Range("B2").ListObject.ListColumns(MyArray1(r)).DataBodyRange.Copy _ 73 .Range("B6").ListObject.ListColumns(MyArray1(r)).DataBodyRange 74 End With 75 End If 76 Next r 77 ws.Delete 'Sheets("T_送信")削除 78 wb.Close False 79 Next i 80 81 82 83End Sub 84

上記コードの以下の部分がわかりません。

VBA

1 'sheets("T_送信")をデータをsheets("送信")へコピー-------------------------------------------------------------- 2 For r = LBound(MyArray1) To UBound(MyArray1) 3 If ws2.Range("B2").ListObject.ListColumns(MyArray1(r)).HeaderRowRange = MyArray1 Then

配列MyArray1には、セルから取得した文字列が確報されています。
ws2.Range("B6")はテーブルのヘッダーです。

テーブルのヘッダーが配列に該当するとき、処理開始としたいのですが、
オブジェクトはこのプロパティまたはメソッドをサポートしていませんとでます。

どうにかテーブルのヘッダーが配列に該当するときという条件式を書くことはできないのでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2021/03/20 02:19

「テーブルのヘッダーが配列に該当する」とは具体的にはどのようなことでしょうか。 「テーブルのヘッダーの値が」ということですか。 値は配列ではないので、比較することはできません。
jinoji

2021/03/20 03:15

配列に該当すればListColumns(MyArray1(r)) は成立するかもしれないけど、MyArray1(r)の値が"ああああ"だったらエラーじゃない?
jinoji

2021/03/20 03:19

HeaderRowRangeをFor Eachして、 MyArray1をCountIfするとかでどうですか?
jinoji

2021/03/20 04:46 編集

For r = LBound(MyArray1) To UBound(MyArray1) を活かすなら If WorksheetFunction.CountIf(HeaderRowRange, MyArray1(r)) = 1 Then とかでしょうか
Dis

2021/03/20 04:48

hatena19さん テーブルのヘッダーの値がという意味でした。 比較できないことを知れてよかったです。ありがとうございました。 jinojiさん 上記のコードでためしたところ、うまく動きました。 このwsf.Countif(~) = 1 thenはよく使うコードなのでしょうか。 自分がどんなに頭をひねってもたどりけなかったコードなので非常に感動しています。 ありがとうございました。
guest

回答1

0

自己解決

jinojiさんのコードでうまくいきました。ありがとうございました。

投稿2021/03/20 04:49

Dis

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問