人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

現在テストAの感じでマクロを実行しているのですが、処理時間が長くて困っています。
そして、テストBを試してみた所、絶対参照で貼り付けられてしまします。
相対参照にするには、どうすれば良いのでしょうか?

Sub テスト_A()
For J = 16 To 45
Cells(J, 1).Copy
For I = 20 To 30
Cells(I, J - 11).Select
ActiveSheet.Paste
Next I
Next J
End Sub

Sub テスト_B()
For J = 16 To 45
For I = 20 To 30
Next I
Next J
End Sub

●質問者: an_shoku_panman
●カテゴリ:コンピュータ
✍キーワード:NeXT SELECT sub テスト マクロ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● SALINGER
●27ポイント

これはテスト_Aでも絶対参照になっていると思うのですが。

テスト_Aでも簡単に高速に処理する方法はあります。

Sub テスト_A()
 Application.ScreenUpdating = False
 
 For J = 16 To 45
 Cells(J, 1).Copy
 For I = 20 To 30
 Cells(I, J - 11).Select
 ActiveSheet.Paste
 Next I
 Next J
 
 Application.ScreenUpdating = True
End Sub

このようにScreenUpdatingで画面更新を停止させて、最後に全部更新させるようにすると高速になります。

http://www.relief.jp/itnote/archives/001259.php

◎質問者からの返答

御返答ありがとうございます。

テストB抜けていました。済みませんでした(_ _)

Sub テスト_B()

For j = 16 To 45

For I = 20 To 30

Cells(I, j - 11).Formula = Cells(j, 1).Formula

Next I

Next j

End Sub

この方法だとAと比べ処理速度は速いのですが、

書式が移らない問題がでてきました。

単純にCells(I, j - 11).Format = Cells(j, 1).Format

で試してみたのですがエラーとなりました。

申し訳ないですが対処方法を教えて頂けないでしょうか。

よろしくお願い致します。(_ _)


2 ● HALSPECIAL
●27ポイント

[XL97]数式の特定セルへの参照形式を変更する方法

6) 数式のセル参照を変換する


動作未確認でしが、こんな感じでいかがでしょう。


Sub テスト_A()

Application.ScreenUpdating = False
Application.Calculation = xlManual

For J = 16 To 45
 Cells(J, 1).Copy
 For I = 20 To 30 
 Cells(I, J - 11).Select
 ActiveSheet.Paste
 If ActiveCell.HasFormula Then
 ActiveCell.Formula = Application.ConvertFormula(Formula:=ActiveCell.Formula, _
 FromReferenceStyle:=xlA1, ToAbsolute:=xlRelative)  'xlRelative Or xlAbsolute
 End If
 Next I
Next J

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub

速度に関して言えば、ScreenUpdating で描画を止め、

Calculationで数式の計算を止めた状態で、

処理させてあげると高速化できます。

そして最後に戻してあげます。

数式の計算結果を処理中で参照する場合はその都度、再計算させてあげる必要があります。

また、数式の参照形式の変換は、ConvertFormula で行います。

◎質問者からの返答

御返答ありがとうございます。

テストB抜けていました。済みませんでした(_ _)

Sub テスト_B()

For j = 16 To 45

For I = 20 To 30

Cells(I, j - 11).Formula = Cells(j, 1).Formula

Next I

Next j

End Sub

この方法だとAと比べ処理速度は速いのですが、

書式が移らない問題がでてきました。

単純にCells(I, j - 11).Format = Cells(j, 1).Format

で試してみたのですがエラーとなりました。

申し訳ないですが対処方法を教えて頂けないでしょうか。

よろしくお願い致します。(_ _)


3 ● SALINGER
●26ポイント

この解釈でいいのかわかりませんが、

コメント欄を拝見するとテスト_AはA列の数式が相対的に変化し、テスト_Bでは数式がそのまま受け渡されるということになりますでしょうか。

テスト_Bのルールで書式もコピーする方法ならば、PasteSpecialで書式だけコピーするコードを追加する方法もありますが、全部コピーして数式だけ上書きするほうが簡単でしょう。

計算方法が自動ならばID:HALSPECIAL さんの回答にあるシートの再計算も止めてしまえば高速に処理できると思います。


Sub テスト_B()
 Application.ScreenUpdating = False
 Application.Calculation = xlManual
 
 For j = 16 To 45
 For i = 20 To 30
 Cells(j, 1).Copy Cells(i, j - 11)
 Cells(i, j - 11).Formula = Cells(j, 1).Formula
 Next i
 Next j
 
 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic
End Sub
◎質問者からの返答

たびたびの返信ありがとうございます。

>テスト_Bでは数式がそのまま受け渡されるということになりますでしょうか。

御指摘の通り、こちらも問題となっています。

HALSPECIAL さんから教えて頂きました、以下のコードを

変更して試しているのですが、

ActiveCell.Formula = Application.ConvertFormula(Formula:=ActiveCell.Formula, _

FromReferenceStyle:=xlA1, ToAbsolute:=xlRelative) 'xlRelative Or xlAbsolute

Cells(i, j - 11).Formula=Application.ConvertFormula(Formula:=Cells(i, j - 11).Formula, _

FromReferenceStyle:=xlA1, ToAbsolute:=xlRelative)

理解が足りず上手く行っていません。

対処方法を教えて頂ければ嬉しいです。

あ!ちなみに書式は完璧でした。ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ