現在テスト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

回答の条件
  • 1人5回まで
  • 登録:2009/10/11 05:42:31
  • 終了:2009/10/18 05:45:02

回答(3件)

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692009/10/11 09:29:23

ポイント27pt

これはテスト_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

id:an_shoku_panman

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

テスト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

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

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

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

2009/10/12 06:31:16
id:HALSPECIAL No.2

HALSPECIAL回答回数407ベストアンサー獲得回数862009/10/11 09:38:34

ポイント27pt

[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 で行います。

id:an_shoku_panman

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

テスト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

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

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

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

2009/10/12 06:32:08
id:SALINGER No.3

SALINGER回答回数3454ベストアンサー獲得回数9692009/10/12 08:53:09

ポイント26pt

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

コメント欄を拝見するとテスト_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
id:an_shoku_panman

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

>テスト_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)

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

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

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

2009/10/12 13:45:22
  • id:Mook
    テストBは空ですが・・・。
    EXCELでいう相対参照・絶対参照というのは、式の中で参照しているセルのアドレスの指定方法のことを指しますが、質問での内容はこのことですか?

    それとも式が数値になってしまうということでしょうか?
  • id:SALINGER
    いまいち私の理解が足りないようで申し訳ありません。
    最初の1と2の回答で不具合がある場合、具体的にどのような不具合でしたか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません