こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル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

投稿日時 - 2008-09-17 14:04:07

QNo.4335621

暇なときに回答ください

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

こんにちは ^^


色んな方法あって迷いますね。
この手の処理では、
 一括で読み込んで
 配列経由で(素直に(?)ループ)処理して
 一括で吐き出す
という方法がまぁ速いのかなぁと。

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

投稿日時 - 2008-09-18 08:51:32

お礼

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

投稿日時 - 2008-09-18 10:09:38

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2008-09-17 16:22:56

お礼

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

投稿日時 - 2008-09-18 10:08:09

ANo.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)
とか?(未検証)

投稿日時 - 2008-09-17 14:53:36

お礼

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

投稿日時 - 2008-09-18 10:06:24

あなたにオススメの質問