- ベストアンサー
エクセル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
- みんなの回答 (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の機能を活用するようにしています。 参考になればよいのですが
その他の回答 (2)
- fujillin
- ベストアンサー率61% (1594/2576)
こんにちは。 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
お礼
なるほど、一度変換してるからそこからもってくればよいのですね。 勉強になります。 ありがとうございます。
- n-jun
- ベストアンサー率33% (959/2873)
.Range("G8:G68").Copy Sheets("データ").Range("C8:BK8").PasteSpecial Paste:=xlValues, Transpose:=True ↓ Sheets("データ").Range("C8:BK8").Value = _ Application.Transpose(.Range("G8:G68").Value) とか?(未検証)
お礼
ありがとうございます。 コピーペーストじゃなくとも行列変換ができるんですね、勉強になりました。
お礼
やはり配列ですね。 とても勉強になります。 ありがとうございました。