前提・実現したいこと
エクセルファイルをVBAで操作したい
<前提>
①:対象のエクセルのシート数・データ数は都度変わる
②:エクセルのA3からH(n)までの情報を取得し、配列化したい
発生している問題
配列は作れたものの、各シートの情報を格納したものではなく、 対象のブックが開かれたときにアクティブになるシートの情報しか得られません。 例として、シート1は範囲がA3~H99までとしたとき、範囲が(97,8)となる配列は作れるものの、 配列の中身がシート3だったり4だったりしています。 初心者なのできっとしょうもない過ちを犯しているのでしょうが、 調べてみても解決策は見出せませんでした。
該当のソースコード
Sub testMain() Dim fName As String 'ファイルネーム Dim wb As Workbook 'ワークブックオブジェクト Dim sCount As Integer 'シート数 MsgBox "操作したいファイルは予め保存の上閉じてください" ' ファイルを開くダイアログ表示 fName = Application.GetOpenFilename(",*.xlsx") ' ワークブックを開く Set wb = Workbooks.Open(fName) '対象のワークブックのワークシート数を取得する sCount = wb.Worksheets.Count '取得したシート数分処理を繰り返す Dim i As Integer For i = 1 To sCount 'ループの中でSubを実行 Call testSub(i, wb) Next i MsgBox "完了しました" End Sub ■■■■■■ Private Sub testSub(i, wb) Dim rCount As Long '行数 'iシート目のワークシートオブジェクトの行数を取得する rCount = wb.Worksheets(i).Cells(Rows.Count, 1).End(xlUp).Row '配列を用意 Dim arr() As Variant With wb.Worksheets(i) 'arr(rCount-2,8)の配列を作る arr = Range("A3:H" & rCount) End With 'MsgBoxで試しに出力してみたところ、範囲はiシート目のものだが、中身の情報が全て特定の1シートになっている。 MsgBox arr(rCount - 2, 3) End Sub
試したこと
範囲を配列に代入する際、
arr = wb.Worksheets(i).Range("A3:H" & rCount)
とした所”型が一致しません”のエラーが出てしまいます。
補足情報
前提で書いた処理が面倒でVBAに手を出した初心者なので、
試したことの情報が少なく恐縮です。
上のコードもまだ完成形ではなく、最終的には配列内の要素同士を比較し、
結果を別配列に格納する下記のような処理を自動で行うマクロが作りたいです。
If arr(i,2)<>arr(i-1,2) Then
arrA(i) = 0
End If
wb.Worksheets(i).Range("B" & i ).Value<>wb.Worksheets(i).Range("B" & i-1).Value
のように直接比較するコードは書けたのですが、同様の処理を1行内で数個所行い、
更にi=rCountとなるまで繰り返す必要があるので、1シートの処理に数分かかる有様でとても使い物になりません。
皆様の知恵をお借りしたく投稿いたしました。知恵をお貸しください。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/09 02:47