エクセルの神髄の練習問題17について、回答通りの動作をを配列にて実行する方法を模索しております。
連想配列やユーザー定義型の使用も考えましたが、ブック名とブック名に対応するシート名を切り分けて配列に格納し、回答シートに吐き出せばいいかいまいちピンときません。
どなたかベストな記述を教えて頂けたら幸いです。よろしくお願いします。
練習問題17リンク
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
一旦配列に格納して、それをシートに出力するようにしたい。
という質問だとして回答します。
尚、今回の回答として関係ない所は省いています。
VBA
1Private Type Book_Type 2 BookName As String 3 SheetNames() As String 4End Type 5 6Public Sub test() 7 Dim i As Long 8 Dim j As Long 9 Dim k As Long 10 11 Dim wb As Workbook 12 Dim ws As Worksheet 13 Dim wsAns As Worksheet 14 15 Set wsAns = Worksheets("練習17_回答") 16 17 Dim tBooks() As Book_Type 18 19 With Worksheets("練習17") 20 ReDim tBooks(.Cells(.Rows.Count, 1).End(xlUp).Row - 2) 21 For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row 22 Set wb = Workbooks.Open(.Cells(i, 1) & "\" & .Cells(i, 2), False, True) 23 tBooks(i - 2).BookName = wb.Name 24 ReDim tBooks(i - 2).SheetNames(wb.Sheets.Count - 1) 25 j = 0 26 For Each ws In wb.Sheets 27 tBooks(i - 2).SheetNames(j) = ws.Name 28 j = j + 1 29 Next 30 wb.Close SaveChanges:=False 31 Next 32 End With 33 34 k = 2 35 For i = 0 To UBound(tBooks) 36 wsAns.Cells(k, 1).Value = tBooks(i).BookName 37 For j = 0 To UBound(tBooks(i).SheetNames) 38 wsAns.Cells(k, 2).Value = tBooks(i).SheetNames(j) 39 k = k + 1 40 Next 41 Next 42 43End Sub 44 45
シンプルなのだとこんなのでいいんじゃないでしょうか。
投稿2021/05/05 22:26
総合スコア1525
0
書いてみた。
VBA
1Sub sample() 2 With Worksheets("練習17") 3 4 Dim arrBooks(), arrSheets() 5 Dim wPath, wBook 6 Dim i, j 7 Dim ws As Worksheet 8 9 For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row 10 wPath = .Cells(i, 1).Value 11 wBook = .Cells(i, 2).Value 12 13 With Workbooks.Open(wPath & "\" & wBook) 14 For Each ws In .Worksheets 15 j = j + 1 16 ReDim Preserve arrBooks(j) 17 ReDim Preserve arrSheets(j) 18 If ws.Index = 1 Then arrBooks(j) = wBook 19 arrSheets(j) = ws.Name 20 Next 21 .Close False 22 End With 23 Next 24 End With 25 26 arrBooks(0) = "ブック名" 27 arrSheets(0) = "シート名" 28 29 For Each ws In Worksheets 30 If ws.Name = "練習17_回答" Then Exit For 31 Next 32 If Not ws Is Nothing Then ws.Delete 33 Worksheets.Add.Name = "練習17_回答" 34 Worksheets("練習17_回答").Cells.Resize(j + 1, 2).Value = WorksheetFunction.Transpose(Array(arrBooks, arrSheets)) 35 36End Sub 37
投稿2021/05/06 05:49
総合スコア4592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
「回答通りの動作をを配列にて実行する」目的は何でしょうか。
ブック数が多くて時間かかかるのでそれを高速化したい。
WEBで配列を使うと高速化できるという情報があるので、配列にしたら高速化できるだろ。
ということでしょうか。
配列で高速化できるは、セルの読み書きです。広範囲のセルの参照や書き込みを配列を使うと一度に読み書きできるので高速化できます。
今回の要件だと参照したいブックの数は多くても数百ですよね。それぐらいなら配列を使っても、直接セルに読み書きしてもそれほど差はでないと思います。
それよりもブックを一つずつ開いて閉じるという部分にはるかに時間がかかります。この部分を高速化できないかを検討するのが先決でしょう。「エクセルの神髄」さんのサイトに下記の情報があります。
この方法でシート名を取得すると高速化できるでしょう。
Excelファイルを開かずにシート名を取得|VBAサンプル集
一応、練習問題17(ブック・シートの操作の練習)解答|VBA練習問題解答の解答コードを配列を使用したものに書き直したコードです。(たいして高速化は期待できません。)
vba
1Sub 練習問題17() 2 Dim i As Long 3 Dim j As Long 4 Dim wb As Workbook 5 Dim ws As Worksheet 6 Dim wsAns As Worksheet 7 Application.DisplayAlerts = False 8 For Each ws In Worksheets 9 If ws.Name = "練習17_回答" Then 10 ws.Delete 11 Exit For 12 End If 13 Next 14 Application.DisplayAlerts = True 15 Set wsAns = Worksheets.Add(after:=Worksheets("練習17")) 16 wsAns.Name = "練習17_回答" 17 18 Dim aryQ 19 aryQ = Worksheets("練習17").Range("A1").CurrentRegion.Value '練習データを配列に格納 20 21 Dim aryAns() 22 ReDim aryAns(1 To 2, 1 To 2) '回答格納用配列 23 aryAns(1, 1) = "ブック名" 24 aryAns(2, 1) = "シート名" 25 26 '↓ブック名、シート名を回答用配列に格納 27 j = 2 28 For i = 2 To UBound(aryQ) 29 Set wb = Workbooks.Open(aryQ(i, 1) & "\" & aryQ(i, 2)) 30 aryAns(1, j) = wb.Name 31 For Each ws In wb.Sheets 32 aryAns(2, j) = ws.Name 33 j = j + 1 34 ReDim Preserve aryAns(1 To 2, 1 To j) 35 Next 36 wb.Close SaveChanges:=False 37 Next 38 39 '回答用配列を回答シートに出力 40 wsAns.Range("A1").Resize(j - 1, 2).Value = WorksheetFunction.Transpose(aryAns) 41 42End Sub 43
投稿2021/05/06 04:56
編集2021/05/06 05:40総合スコア34367
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/06 14:48
2021/05/07 00:59
2021/05/08 00:38