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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

Q&A

解決済

1回答

649閲覧

VBAで二次元配列でのコピーとペーストをしたい

taku-s

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

0グッド

0クリップ

投稿2022/09/30 05:55

前提

仕事でVBAを使用する為、学習を始めました。
データ量が多いCSVファイルを加工する必要がある為、
高速処理ができる二次元配列を使用して、コピーや貼り付けができるようにアウトプットしています。

実現したいこと

A1:AA6(6行27列)の表があり、この表をコピーと貼り付けしたいのですが、
以下のコードで実行するとA1:F6(6行6列)0しか貼り付けされません。

表全てをコピーし、貼り付けができるようにしたいです。

該当のソースコード

VBA

1Sub test() 2 Dim row_i As Integer, column_i As Integer 3 Dim arr() As Variant 4 5 Set MasterWs = Worksheets("sample") 6 7'行数列数を求める 8 rowsData = MasterWs.Cells(Rows.Count, 1).End(xlUp).Row 9 columnsData = MasterWs.Cells(1, Columns.Count).End(xlToLeft).Column 10 11 12 ReDim Preserve arr(columnsData, rowsData) 13 14'二次元配列に値を入れていく。恐らくここがおかしい。 15 For column_i = 0 To columnsData 16 For row_i = 0 To rowsData 17 arr(column_i, row_i) = MasterWs.Cells(column_i + 1, row_i + 1) 18 Next 19 Next 20 21 22 iRowMax = UBound(arr, 1) - LBound(arr, 1) 23 iColMax = UBound(arr, 2) - LBound(arr, 2) 24 Range("A8").Resize(iRowMax, iColMax).Value = arr 25 26End Sub 27

試したこと

表の中で空白があれば、埋めてみた。
縦も横も6行なのが怪しかったので、column_iとrow_iを逆にしてみた。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Rangeの場合はA8など「列+行」なんですけどResizeなど「,」を使う場合は「行、列」で「8,1」もしくは「8,"A"」になります。

Dim row_i As Integer, column_i As Integer Dim arr() As Variant Dim rowsData As Integer Dim columnsData As Integer Dim iRowMax As Integer Dim iColMax As Integer Dim MasterWs As Worksheet Set MasterWs = Worksheets("sample") '行数列数を求める rowsData = MasterWs.Cells(Rows.count, 1).End(xlUp).row columnsData = MasterWs.Cells(1, Columns.count).End(xlToLeft).Column ReDim Preserve arr(rowsData, columnsData) 'こういう方法も 'arr = Range(Cells(1, 1), Cells(rowsData, columnsData)) 'iRowMax = UBound(arr, 1) - LBound(arr, 1) + 1 'iColMax = UBound(arr, 2) - LBound(arr, 2) + 1 For row_i = 0 To rowsData For column_i = 0 To columnsData arr(row_i, column_i) = MasterWs.Cells(row_i + 1, column_i + 1) Next Next iRowMax = UBound(arr, 1) - LBound(arr, 1) iColMax = UBound(arr, 2) - LBound(arr, 2) Range("A8").Resize(iRowMax, iColMax).Value = arr

投稿2022/09/30 06:49

bebebe_

総合スコア504

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

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

taku-s

2022/09/30 07:55

お早い返答ありがとうございます、 上記コードで実現できました。 列と行の引数が逆になっていたんですね。。。 「列+行」と「行+列」の使い分けがなかなかこんがらがりそうです、、 また、変数の宣言などの抜け漏れなど素人レベルでできておりませんでした。 初歩的なことですが、そこも学ばせていただきました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問