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

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

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

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

Q&A

2回答

554閲覧

excel vbaを使って同じフォルダー内のファイルを開きたい

doridori17

総合スコア6

VBA

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

0グッド

1クリップ

投稿2019/08/11 07:26

前提・実現したいこと

excel2013でVBAを使って、フォルダー内のファイルを全て開き、マクロを記録したファイルのデータを開いた他のファイルにコピーしたいと考えています。、フォルダー内のファイルを開くところまでコードを記入したのですが、フォルダーネームを定義するところで、以下のエラーメッセージが出ました。

発生している問題・エラーメッセージ

コンパイルエラー 引数エラーメッセージ がLeft関数に対して出ました。

該当のソースコード

ソースコード
Sub Macro5()
'
' Macro5 Macro
'

'
Dim FolderName As String
Dim index As Integer
Dim FileName As String
FolderName = Application.GetOpenFilename
If FolderName = "False" Then
Exit Sub
End If

index = InStrRev("C:\Users***\Documents\macro練習用\", "\") FolderName = Left("C:\Users***\Documents\macro練習用\" & index) FileName = Dir("C:\Users***\Documents\macro練習用\" & "*.xlsx") Do While FileName = "" Workbooks.Open FileName = Dir("C:\Users***\Documents\macro練習用\" & "*.xlsx*") Loop

End Sub

試したこと

indexで引数を記入していると、私は理解していたので、引数が足りないの意味がわからず、indexを"""で囲んでみましたがエラーメッセージは変わりませんでした。

補足情報(FW/ツールのバージョンなど)

このエラーを解決したく、よろしくお願いします。

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

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

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

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

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

crowmt

2019/08/11 08:08

InStrRevが返すINDEXは何を意味すると考えていますか? LEFT関数はどういうものとして考えていますか? また、「フォルダー内のファイル」は「Application.GetOpenFilename」で選んだファイルのあるフォルダを指していますか? その場合、「"C:\Users\*\Documents\macro練習用\"」と固定フォルダを指定しているのはなぜでしょうか。
meg_

2019/08/11 11:21

エラーメッセージをそのまま全て載せていただけませんか?
doridori17

2019/08/11 12:18

エラーメッセージは「コンパイルエラー 引数は 省略できません」です。
doridori17

2019/08/11 13:12

InStrRevが返すINDEXは、フォルダー名を文字位置を数で返していると考えていました。LEFT関数は検索埼左から指定数の文字列を返すものと考えています。「Application.GetOpenFilename」と「"C:\Users\*\Documents\macro練習用\"」は同じものと考えていました。
crowmt

2019/08/11 19:28

承知しました。個々は分かっているようですが、変数や組み立て方が理解できていない感じですね。
guest

回答2

0

質問の答えだけですと

VBA

1FolderName = Left("C:\Users*\Documents\macro練習用\" & index)

VBA

1FolderName = Left("C:\Users*\Documents\macro練習用\", index)

ですが、変数の意味合いがなくなっています。

ソース内にコメントしていますのでご確認ください。
デバッグしながら1行1行意味を理解するようにすると先に進みやすくなると思います。

VBA

1Sub Macro5() 2' 3' Macro5 Macro 4' 5 6' 7 Dim FolderName As String 8 Dim index As Integer 9 Dim FileName As String 10 11 FolderName = Application.GetOpenFilename ' ← FolderName = "C:\Users*\Documents\macro練習用\test.xlsm" 12 ' 仮にtest.xlsmというファイルを選択したとする 13 If FolderName = "False" Then 14 Exit Sub 15 End If 16 17 index = InStrRev(FolderName, "\") ' ← 後ろから\を探し、その位置をindexに返す index=30 18 FolderName = Left(FolderName , index) '←フォルダパスを抜き出す 左から30文字をFileNameにセット 19 'FolderName = "C:\Users*\Documents\macro練習用\" 20 21 FileName = Dir(FolderName & "*.xlsx") '← フォルダの最初のExcelファイルを取得 22 23 Do While FileName <> "" '← フォルダ内のファイルがなくなるまで回す(つもりと思われる) 24 ' FileName = "" ではファイル名がない時にWhileするとなるので矛盾する 25 26 ' ↓ファイルを開くのと、フォルダ内の次のファイルを取得するのがごちゃ混ぜになっている 27 ' この先はまだ考えていないと思われるので省略 28 Workbooks.Open FileName = Dir("C:\Users***\Documents\macro練習用\" & "*.xlsx*") 29 30 Loop 31 32End Sub

投稿2019/08/11 19:36

編集2019/08/11 19:40
crowmt

総合スコア402

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

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

doridori17

2019/08/12 01:49

ありがとうございます。一行ずつデバックして進んだので、indexの意味がわかりました。フォルダーが開くところまできたので、ファイルを開くコードを自分で考えてみます。変数と組み合わせは理解するとできることが増えそうなので、さらに調べてみます。大変助かりました。 。
crowmt

2019/08/12 15:29

ある程度解消できたようで何よりです。質問的にはまだ解決していないと思われますが、調査に時間がかかるようでしたら一旦クローズされた方がいいかと思います。
guest

0

質問者様が下記コードでやりたいことが"C:\Users*\Docu~"から末尾の「\」を取り除きたいことだとすると、

vba

1FolderName = Left("C:\Users*\Documents\macro練習用\" & index)

下記で出来ます。

vba

1FolderName = Mid("C:\Users*\Documents\macro練習用\", 1, index - 1)

投稿2019/08/11 12:36

meg_

総合スコア10580

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問