• ベストアンサー

エクセルVBAでもっと早く転記

エクセル2000です。 以下は、列をコピーし行にペーストする作業を含むVBAですが、もっとスマートに早く転記する方法がありましたらご教示ください。 お願いします。 Sub TEST() With Application .ScreenUpdating = False .Calculation = xlCalculationManual Sheets("データ").Range("B8:DH8").ClearContents With Sheets("入力") .Range("G8:G68").Copy Sheets("データ").Range("C8:BK8").PasteSpecial Paste:=xlValues, Transpose:=True .Range("G14:G15").Copy Sheets("データ").Range("BM8:BN8").PasteSpecial Paste:=xlValues, Transpose:=True Sheets("データ").Range("BQ8") = .Range("G21") Sheets("データ").Range("BR8") = .Range("G23") .Range("G25:G29").Copy Sheets("データ").Range("BS8:BW8").PasteSpecial Paste:=xlValues, Transpose:=True .Range("G32:G68").Copy Sheets("データ").Range("BX8:DH8").PasteSpecial Paste:=xlValues, Transpose:=True End With Application.CutCopyMode = False .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

こんにちは ^^ 色んな方法あって迷いますね。 この手の処理では、  一括で読み込んで  配列経由で(素直に(?)ループ)処理して  一括で吐き出す という方法がまぁ速いのかなぁと。 TRANSPOSE系の動作が(XL2000では特に)重いように私は感じるので、 ご提示のコードの実行速度への不満についても 同じ2000ユーザーとしては解る気がします。 以下のコードの要点は、 -Variant型の変数(配列)と、セル範囲との間で相互に  値を一括でIn/Outできる- Excel(ExcelVBA)ならではの優れた機能、 です。 丁寧な動作確認や計時や比較などは今回しませんでしたが、 どうでしょうねぇ。 (App系の処理は省略しました) Sub Test()  Dim i As Long  Dim vntSource  Dim vntPrint vntSource = Worksheets("入力").Range("G8:G68").Value  ReDim vntPrint(0, 110)  For i = 1 To 110   Select Case i   Case Is <= 61 vntPrint(0, i) = vntSource(i, 1)   Case 63 To 64 vntPrint(0, i) = vntSource(i - 56, 1)   Case 69 To 73 vntPrint(0, i) = vntSource(i - 51, 1)   Case Is >= 74 vntPrint(0, i) = vntSource(i - 49, 1)   End Select  Next i vntPrint(0, 67) = vntSource(14, 1) vntPrint(0, 68) = vntSource(16, 1) Worksheets("データ").Range("B8:DH8").Value = vntPrint  Erase vntSource: Erase vntPrint End Sub こういうのって コーディングに至るまでの設計が、慣れないと大変かも知れませんね。 Index同士をどう対応させるか...数値を採ったりする時私は、 Excelのシートに作表して、Excelの機能を活用するようにしています。 参考になればよいのですが

参考URL:
http://www.clayhouse.jp/array/array.htm
merlionXX
質問者

お礼

やはり配列ですね。 とても勉強になります。 ありがとうございました。

その他の回答 (2)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

こんにちは。 1回だけの実行なら、速度はたいして問題になりそうもないので、検証していません。 コピー元の範囲がG8:G68だけなので、行列の変換は一度だけで良いと考えられます。 コピー・ペーストの部分のみ、書換えてみました。 (範囲はきちんと確認していませんので、再確認してください) Sheets("入力").Range("G8:G68").Copy With Sheets("データ")  .Range("C8:BK8").PasteSpecial Paste:=xlValues, Transpose:=True  .Range("BM8:BN8").Value = .Range("N8:O8").Value  .Range("BQ8").Value = .Range("P8").Value  .Range("BR8").Value = .Range("R8").Value  .Range("BS8:BW8").Value = .Range("T8:X8").Value  .Range("BX8:DH8").Value = .Range("AA8:BK8").Value End With

merlionXX
質問者

お礼

なるほど、一度変換してるからそこからもってくればよいのですね。 勉強になります。 ありがとうございます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

.Range("G8:G68").Copy Sheets("データ").Range("C8:BK8").PasteSpecial Paste:=xlValues, Transpose:=True    ↓ Sheets("データ").Range("C8:BK8").Value = _ Application.Transpose(.Range("G8:G68").Value) とか?(未検証)

merlionXX
質問者

お礼

ありがとうございます。 コピーペーストじゃなくとも行列変換ができるんですね、勉強になりました。

関連するQ&A

専門家に質問してみよう