質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

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

Q&A

1回答

674閲覧

セルを検索して列番号を取得する方法は?

nekosyokupan

総合スコア1

VBA

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

0グッド

0クリップ

投稿2022/09/14 03:23

excelのマクロで、指定したフォルダ内のcsvデータすべてに対して、「Di_DegC」と入力されているセルの列番号を取得してその列の平均値を取得し、平均値がある範囲内ならそのcsvファイルの名前を変更するというマクロを作りたいと考えています。

Sub Datarename() Dim path, FSO, file, files Dim ItemCol As Long Dim LastRow As Long Dim AVGC As Double path = Range("B2").Value Set FSO = CreateObject("Scripting.FileSystemObject") Set files = FSO.GetFolder(path).files For Each file In files If file.Name = "*.csv" Then ItemCol = file.Rows(1).Find("Di_DegC").Column LastRow = file.Columns("ItemCol").End(xlDown).Row AVGC = WorksheetFunction.Average(file.Range(Cells(ItemCol, 2), Cells(ItemCol, Lastlow))) If 120 < AVGC < 130 Then Name file As "*_WarmUp.csv" Else If 200< AVGC < 210 Then Name file As "*_Heat.CSV" End If End If Next MsgBox "完了" End Sub

こちらのプログラムをかいたところ、
ItemCol = file.Rows(1).Find("Di_DegC").Column
ここで実行時エラー438が出ているようです。

1行目のどこかにあるDi_DegCを検索して列番号を返すプログラムだと思うのですが、何か間違っていますか?vba初心者につき教えていただけると助かります。

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

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

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

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

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

guest

回答1

0

いろいろ間違ってますね。

  1. file.Name = "*.csv".csvで終わるファイル名かチェックしているつもりでしょうが、ワイルドカード文字(*)を使う比較は=演算子ではなくLike演算子を使う必要があります。

  2. 番号リストFileSystemObjectのfileオブジェクトにRowsとかColumnsとかありません。Excelのワークシートのプロパティですので、CSVファイルをワークブックとして開く必要があります。

  3. 120 < AVGC < 130 このような比較はできません。120 < AVGC AND AVGC < 130 と一つずつ比較する必要があります。

  4. Name file As "*_WarmUp.csv" Nameステートメント(ファイル名変更命令)ではワイルドカード文字(*)は使えません。また、引数にflieオブジェクトではなく、ファイルのフルパスを指定する必要があります。

他にもありますが、もろもろ考慮して修正すると、下記のようになります。

vba

1Sub Datarename() 2 Dim path, FSO, file, files 3 Dim ItemCol As Long 4 Dim LastRow As Long 5 Dim AVGC As Double 6 7 path = Range("B2").Value 8 9 Set FSO = CreateObject("Scripting.FileSystemObject") 10 Set files = FSO.GetFolder(path).files 11 12 For Each file In files 13 14 If file.Name Like "*.csv" Then 15 Dim wb As Workbook 16 Set wb = Workbooks.Open(file.path) 'CSVファイルをワークブックとして開く 17 Dim ws As Worksheet 18 Set ws = wb.Worksheets(1) '開いたブックのワークシート 19 20 ItemCol = ws.Rows(1).Find("Di_DegC").Column 21 LastRow = ws.Columns(ItemCol).End(xlDown).Row 22 23 AVGC = WorksheetFunction.Average(ws.Range(ws.Cells(ItemCol, 2), ws.Cells(ItemCol, Lastlow))) 24 25 wb.Close SaveChanges:=False '開いたブックを閉じる 26 27 If 120 < AVGC And AVGC < 130 Then 28 29 Name file.path As Replace(file.path, ".csv", "_WarmUp.csv") 30 31 ElseIf 200 < AVGC And AVGC < 210 Then 32 33 Name file.path As Replace(file.path, ".csv", "_Heat.CSV") 34 35 End If 36 37 End If 38 39 Next 40 41 MsgBox "完了" 42 43End Sub

動作確認はしてないので、チェック漏れがあるかもしれません。エラー等が出ましたら、どこでどのようなエラーがでたかコメントしてください。

投稿2022/09/14 12:41

編集2022/09/15 02:06
hatena19

総合スコア33715

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

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

nekosyokupan

2022/09/15 01:44

返信ありがとうございます。こちらのプログラム、 LastRow = ws.Columns("ItemCol").End(xlDown).Row この行でエラーが出ましたがColumns以降のカッコの""を消すとうまく動いてやりたかったことができるようになりました。 bva初めてでしたので助かりました。ありがとうございました。
hatena19

2022/09/15 02:05

おっと、やはり間違いがありましたか。 回答の方は修正しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問