元のVBAコードは3列の小さな表が3つ横に並んでいたものを縦につなげるために使用していました。
今回は9列の表が横に200以上あり、修正して使用したいと思いましたが、
ここでエラーが出て止まってしまいます。
InputData(Z, Q) = Cells(i, Q + j)
どのように直すと使用することが出来ますでしょうか。どなたか知恵を貸してください。
どうぞよろしくお願いいたします。
Sub 横データを縦データに変換する()
Dim i As Long
Dim j As Long
Dim Q As Long
Dim Z As Long
Dim YokoLoop As Long
Dim TateLoop As Long
Dim InputData(710000, 2) As String
'横ループ回数
YokoLoop = Range("A1").End(xlToRight).Column
'縦ループ回数
TateLoop = Cells(Rows.Count, 1).End(xlUp).Row
Z = 0
'横ループ
For j = 1 To YokoLoop Step 3
'縦ループ
For i = 2 To TateLoop
'9列分の値を配列に格納
For Q = 0 To 8
InputData(Z, Q) = Cells(i, Q + j)
Next Q
Z = Z + 1
Next i
Next j
' 配列を一気にセル範囲に転記
Cells(2, 2560).Resize(710000, 9).Value = InputData
'配列のクリア
Erase InputData
End Sub
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
No1です。
>やりたいことは、
>9列285行で1組のデータがA列からCTH列まで横に並んであります。(284組)
>表頭以外のデータを縦に移動して1組のデータにつなげたいと思っています。
質問者様には「あたりまえ」のことでも、文章だけが全情報の回答者には「あたりまえ」のことが記載がなければわかりません。
どうやら、固定の大きさのブロック(=セル範囲w×h)が横にたくさん並んでいるものを、ブロックはそのままで、縦に並べ替えたいものと解釈しました。
説明文では固定のサイズですが、ご提示のコードではEnd(xlUp)などで縦方向のセル範囲を取得していたりするようですが、不定なのか固定なのかどっちなんでしょうね?
A列、及び1行目でサイズを取って問題ないのでしょうか?(=たまたま、データに空白セルが存在したりしないのか)
よくわかっていませんが、上記の解釈で良いとするなら・・
以下は、単純に1ブロックごとにコピペを繰り返す方法での例です。
たかだか300回程度のようなので、速度に関しては考慮していません。
※ よくわからないので、元のデータはそのまま残してあります。
Sub test()
Dim blockH As Long, n As Long, maxCol As Long
Dim sourceR As Range, destR As Range
Const blockW = 9 ' 1ブロックの列数
blockH = Cells(Rows.Count, 1).End(xlUp).Row ' 1ブロックの行数としてよい?
maxCol = Cells(1, Columns.Count).End(xlToLeft).Column ' 最大行数としてよい?
Set sourceR = Cells(1, 1).Resize(blockH, blockW)
Set destR = sourceR.Offset(blockH)
For n = blockW + 1 To maxCol Step blockW
Set sourceR = sourceR.Offset(, blockW)
destR.Value = sourceR.Value
Set destR = destR.Offset(blockH)
Next n
End Sub
>表頭以外のデータを縦に移動して~
の意味がよくわかりませんでしたので、上記コードでは考慮してありません。
もしも、1列目を無視するとか1行目は無視する、あるいは、1ブロック目のみ1列分余分にあると考えるなどといった意味合いであれば、上記のブロックサイズを調整したり、スタートするセル位置を調整するなどで対応可能であろうと想像します。
No.1
- 回答日時:
こんばんは
何をなさりたいのかよくわかりませんけれど・・
>ここでエラーが出て止まってしまいます。
>InputData(Z, Q) = Cells(i, Q + j)
他にもあるかもですが、単純に原因と考えられるのは、
>Dim InputData(710000, 2) As String
と宣言しているのに対して、二番目の添え字に対して
>For Q = 0 To 8
>InputData(Z, Q) = Cells(i, Q + j)
となっているので、Qの値は最大 8 になりますが、宣言の値を超える値になると考えられます。
ご質問文には、「エラーになる」とだけしか記載がありませんけれど、エラーメッセージがそのような内容になっていませんか?
(「インデックスが有効範囲にありません」のようなメッセージ)
ついでながら、
>YokoLoop = Range("A1").End(xlToRight).Column
として最大列(?)を取得しているのにも関わらず、
>For j = 1 To YokoLoop Step 3
>InputData(Z, Q) = Cells(i, Q + j)
最大列以上のセルを参照しようとしているのも謎です。
※ うまくいかないコードを示しても、回答者へのミスディレクションになるだけです。
まずは、なさりたいことを正確に伝えることの方が重要かと。
(文章を読んでも、当方の乏しい理解力ではよくわかりません)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
エクセルで横データを縦に並べ変えたいです。
財務・会計・経理
-
VBA横のデータを縦にする方法
Excel(エクセル)
-
Excel VBAで、横並びのデータを縦並びにしたい
その他(Microsoft Office)
-
-
4
VBAで横データを縦データに変換する方法を教えて下さい。
その他(Microsoft Office)
-
5
VBA横に並んでいるデータを縦に並ぶデータにしたいです。
Visual Basic(VBA)
-
6
エクセル 横並びの複数行データを縦1列にしたい
Excel(エクセル)
-
7
エクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?
Excel(エクセル)
-
8
エクセルで横並びの複数データを縦の一本のデータにしたい
Excel(エクセル)
-
9
EXCELで「行と列を入れ替える」操作を何回も繰り返して自動実行する方法はないでしょうか?
Excel(エクセル)
-
10
マクロ:横並びデータを縦並びに変更
Excel(エクセル)
-
11
VBAで重複するデータがあれば1個だけ残して他の重複セルを"(空白)にしたいのですが
Excel(エクセル)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでの一時停止と再開の方法
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
UWSCの終了の仕方
-
範囲指定したセルを1つずつ飛...
-
プログラミングについて。 1つ...
-
VBA Dir関数でファイルをループ...
-
VBA Boxが空白の場合のメッセー...
-
vb.netからエクセル関数書き込み
-
For文を使った九九表の作成
-
素数の個数を求めるプログラミング
-
アクティブセルから、A列最終行...
-
EXCEL VBA ユーザーフォームの...
-
テキストボックスの名前に変数...
-
フラグについて
-
ExcelVBA FindNextを使用して条...
-
エディットボックスのテキスト...
-
pythonでリストの要素を小さい...
-
COBOLプログラム
-
アップルループについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
どなたかこのプログラミングを...
-
VBAでの一時停止と再開の方法
-
VBA for i=1 to lastrow
-
UWSCの終了の仕方
-
DoEventsが必要な理由について
-
エクセルの当番表を作っていま...
-
VBAで3秒だけ時間を止めたい
-
GIFアニメをループさせたくない
-
Escキーを押すと、中断する時と...
-
DOSコマンドのループ内のTIMEコ...
-
CSVファイルの特定の行だけを読...
-
アクティブセルから、A列最終行...
-
vb.netからエクセル関数書き込み
-
範囲指定したセルを1つずつ飛...
-
テキストボックスの名前に変数...
-
乱数の桁数指定、または範囲指定。
-
「偶数・奇数の和」のフローチ...
-
vbscriptでIE自動入力(途中で...
おすすめ情報
ご指摘ありがとうございました。
やりたいことは、
9列285行で1組のデータがA列からCTH列まで横に並んであります。(284組)
表頭以外のデータを縦に移動して1組のデータにつなげたいと思っています。