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

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

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

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

Q&A

解決済

1回答

2220閲覧

VBA 配列 ループで格納

yakumo02

総合スコア103

VBA

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

0グッド

0クリップ

投稿2020/07/14 02:16

VBAでエクセルファイルのデータを取得して、そのデータを配列に格納しようとしているのですが、ファイルを取り込むことができません。
配列への格納に問題があると思います。ご教授お願いします。

Sub fileScript() Dim Button, T, I, F, L, Y As Integer Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, FileName As String Dim Kaitou(100, 100) As String Dim MergeWorkbook_data Dim ThisWorkbook_data Application.DisplayAlerts = False T = 5 Button = MsgBox("コピペを行いますか?", vbYesNo + vbQuestion, "確認") If Button = vbYes Then OpenExcelFileName = Application.GetOpenFilename("Microsoft Excelブック,*画面.xlsx") If OpenExcelFileName <> "False" Then ExcelFileName = Dir(OpenExcelFileName) ExcelFilePath = Replace(OpenExcelFileName, ExcelFileName, "") MsgBox ExcelFilsePath & "この選択フォルダからデータを読込み込みます。" Else MsgBox "キャンセルされました" Exit Sub End If FileName = Dir(ExcelFilePath & "*画面.xlsx") Do While FileName <> "" WorkBooks.Open FileName:=ExcelFilePath & FileName, ReadOnly:=True, UpdateLinks:=0 Sheets("画面項目説明").Select L = 0 Y = 0 ここから配列へ格納 配列への代入が失敗します For I = 10 To UBound(Kaitou, 1) For F = 14 To UBound(Kaitou, 1) MergeWorkbook_data = WorkBooks(FileName).Worksheets(I).Range("N" & Rows.Count).End(xlUp).Row ThisWorkbook_data = ThisWorkbook.Worksheets("Sheet3").Range("a" & Rows.Count).End(xlUp).Row Kaitou(L, Y) = Cells(I, "N").Value L = L + 1 Y = Y + 1 Next F Next I ActiveWindow.Close Sheets("Sheet3").Select L = 0 Y = 0 For I = 1 To UBound(Kaitou, 1) For F = 1 To UBound(Kaitou, 1) Cells(T, I).Value = CStr(Kaitou(L, Y)) L = L + 1 Y = Y + 1 Next F Next I FileName = Dir() T = T + 1 Loop Range("B1") = T - 5 MsgBox "ファイル数" & T - 5 & "件 取り込みました。" Else MsgBox "処理を中断します" End If Application.DisplayAlerts = True End Sub

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

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

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

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

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

hatena19

2020/07/14 02:46

「ファイルを取り込むことができません。」だけでは状況が把握できません。 エラーがでるなら、どの行でエラーがでるのか、とエラーメッセージを質問に追記してください。 あと、開発中は、 Application.DisplayAlerts = False のコードはコメントアウトしておきましょう。
yakumo02

2020/07/14 03:03

申し訳ありません エラーではなく下から6行目の MsgBoxでファイルを何件取り込んだか表示するのですが ファイルを取り込めず、「ファイル数0件 取り込みました」 と表示されてしまいます。
ttyp03

2020/07/14 04:13

もう少し状況を整理してください。 コード中に「配列への代入が失敗します」というコメントがありますがエラーが出てるのではないですか? でも↑のコメントではエラーではないという。 またその行まで到達しているのであれば、カウンタTは必ずインクリメントされるはず(途中でループを抜ける手段がないため)なので、0件ということはないはず。 本当に「配列への代入が失敗します」のところは通過しているのでしょうか?
ttyp03

2020/07/14 04:15

それからカウンタTはなぜ5から始めて、わざわざ最後に5を引いているのでしょうか? どういった意味があるのか教えてください。
guest

回答1

0

ベストアンサー

まず、あきらかな間違いを指摘しておきます。

vba

1 MsgBox ExcelFilsePath & "この選択フォルダからデータを読込み込みます。"

この行の ExcelFilsePathExcelFilePath に修正。

vba

1 Dim Button, T, I, F, L, Y As Integer 2 Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, FileName As String

これは、1行目の変数をすべてInteger型、2行目の変数をすべてString型に宣言してつもりでしょうが、しっさいは最後の変数以外はVariant型になります。面倒でも下記のようにひとつひとつ宣言しましょう。

vba

1 Dim Button As Integer, T As Integer, I As Integer, F As Integer, L As Integer, Y As Integer 2 Dim OpenExcelFileName As String, ExcelFileName As String, ExcelFilePath As String, FileName As String

あと、For内のロジックがおかしいと思います。再検討してみてください。

とりあえず、下記の行をコメントアウトして実行してみた場合、なにかアラートは表示されませんか。

vba

1' Application.DisplayAlerts = False

それとステップ実行してみて、想定通りに動いているか確認する作業をしましょう。

投稿2020/07/14 04:33

hatena19

総合スコア34075

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問