
元の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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Excel VBAで、横並びのデータを縦並びにしたい
その他(Microsoft Office)
-
VBA横に並んでいるデータを縦に並ぶデータにしたいです。
Visual Basic(VBA)
-
エクセルで横データを縦に並べ変えたいです。
財務・会計・経理
-
-
4
エクセルで縦に並んだデータをある項目毎に横に並び替えたい
Excel(エクセル)
-
5
VBA横のデータを縦にする方法
Excel(エクセル)
-
6
VBAで横データを縦データに変換する方法を教えて下さい。
その他(Microsoft Office)
-
7
EXCELで「行と列を入れ替える」操作を何回も繰り返して自動実行する方法はないでしょうか?
Excel(エクセル)
-
8
アクティブセルから、A列最終行までフィルダウン
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでの一時停止と再開の方法
-
流れ図(フローチャート)が分か...
-
null 参照の例外が実行時に発生...
-
UWSCに制限時間を付けたいです
-
エクセル関数で1〜12の数字がル...
-
画面を強制的に再描画させる方法
-
CSVファイルの特定の行だけを読...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
VBAで3秒だけ時間を止めたい
-
円のHough変換をC言語で
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
gnuplotについて質問です。
-
WinAPI「MsgWaitForMultipleObj...
-
VB2010でCSVファイルの読み込み
-
VBA横データを縦にしたいです
-
乱数の桁数指定、または範囲指定。
-
.htaccessがループしてる?それ...
-
VBA for i=1 to lastrow
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
UWSCに制限時間を付けたいです
-
Escキーを押すと、中断する時と...
-
乱数の桁数指定、または範囲指定。
-
VBA for i=1 to lastrow
-
流れ図(フローチャート)が分か...
-
DOSコマンドのループ内のTIMEコ...
-
pythonでファイルのコメント行...
-
素数表について。
-
VBAでの一時停止と再開の方法
-
「偶数・奇数の和」のフローチ...
-
DoEventsが必要な理由について
-
vb.netです。2次元配列の要素を...
-
Do whileでExitせず、ループの...
-
ループフリー
-
エクセルの当番表を作っていま...
-
VBAで3秒だけ時間を止めたい
おすすめ情報
ご指摘ありがとうございました。
やりたいことは、
9列285行で1組のデータがA列からCTH列まで横に並んであります。(284組)
表頭以外のデータを縦に移動して1組のデータにつなげたいと思っています。