アプリ版:「スタンプのみでお礼する」機能のリリースについて

元の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

質問者からの補足コメント

  • ご指摘ありがとうございました。

    やりたいことは、
    9列285行で1組のデータがA列からCTH列まで横に並んであります。(284組)
    表頭以外のデータを縦に移動して1組のデータにつなげたいと思っています。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/08/09 07:10

A 回答 (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列分余分にあると考えるなどといった意味合いであれば、上記のブロックサイズを調整したり、スタートするセル位置を調整するなどで対応可能であろうと想像します。
    • good
    • 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)
最大列以上のセルを参照しようとしているのも謎です。


※ うまくいかないコードを示しても、回答者へのミスディレクションになるだけです。
  まずは、なさりたいことを正確に伝えることの方が重要かと。
 (文章を読んでも、当方の乏しい理解力ではよくわかりません)
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご回答どうもありがとうございました。

お礼日時:2023/08/09 07:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています