Excel97で、マクロをなるべく高速化する一般的な
方法を教えて下さい。
画面表示の追随を抑制して高速化する方法が
あると聞いたのですが・・・。他の方法でも
よいのでお願いします。

A 回答 (5件)

画面表示を止めるのは


Application.ScreenUpdating = False
でできます。これをやると結構早くなりますよ。

あとはセルに値を書き込んだり読んだりする時に
セルを選択してから読み書きするのではなくて
直接指定すると早くなります。

Cells(A, 1).Select
Selection.Value = hogehoge
     ↓
Cells(A, 1).Value = hogehoge

といった感じです。
    • good
    • 0

皆さんのおっしゃることにプラスして、


セルの値を変更すると、自動的にエクセルの
計算が動く場合がありますので、

Application.Calculation = xlCalculationManual

を行って、自動計算をとめて、
マクロ終了前に

Application.Calculation = xlCalculationAutomatic

で自動計算するように戻してやってください。
なお、途中で、計算をやらせたい場合は、

Calculateメソッド

で、強制計算させることもできます。
    • good
    • 0

他の皆さんの仰ってるとおりですが、アルゴリズム面に限っていえば、とりあえずはループの中身を最適化してみるのがいいでしょう。


For ~ Next とか、Do ~ Loopの中身には、出来るだけ無駄な処理を書かない。ループの外に出せるものは出してしまう。ってことを意識しながらプログラムを書くと、そこそこ高速なものが出来上がるように思います。
    • good
    • 0

画面表示のoffは1番さんの回答通りです。


またマクロの自動記録を使うと非常に無駄の多いコードに
なるので、無駄な部分はできるだけ省略しましょう。
セル等ををいちいちselectやactiveteする必要は殆ど
ありません(画面の表示をoffにしてても無駄にコード
を消化していくので遅くなります)。

他の一工夫としては
選択するときはifよりはselect構文で、
ループさせるときはfor each next(でしたっけ?)構文の処理が若干早いようです。
    • good
    • 0

セルを見に行く回数をできるだけ減らした方がいいみたいっすよ。


同じセルのデータを使うのに、何回も見に行くと処理が遅くなるみたいで、

a = cells(1,1).value
b = cells(1,1).value * 2
c = cells(1,1).value * 3



a = cells(1,1).value
b = a * 2
c = a * 3

にしたら、処理が早くなったことがあるんだけど・・・。
これって当たり前すか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qexcelのマクロでrangeの選択がうまくいきません。

excelのマクロでrangeの選択がうまくいきません。
以下のマクロをsheet2に書きました。testcopyは動きますが、testcopy2は動きません。なぜなのでしょうか。どうすればいいのでしょうか。それ以外のマクロの部分との関係から、cellsを使い、数字を使ってrangeの処理をしたいのです。よろしくお願いします。

Sub testcopy()
Worksheets("sheet1").Range("B3:C10").Copy
Worksheets("sheet2").Range("e5").Select
ActiveSheet.Paste
End Sub

Sub testcopy2()
Worksheets("sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy
Worksheets("sheet2").Range("e5").Select
ActiveSheet.Paste
End Sub

Aベストアンサー

>testcopyは動きますが、testcopy2は動きません

testcopyは「動作したり、しなかったりする」が正しい表現です。
  要するに今回testcopyが動いたのは▼たまたま▼ということです。

testcopy2 は当然ながらエラーになります。
何れにしろ、両方ともに問題があるということです。
その問題点は2つあります。

(1)アクティブでないシートのセルはSelect(Activate)できない
(2)複数のシートを扱うときのセルの参照は
   そのセルがどのシートのセルなのか明示する必要がある


これを踏まえて、、、、
---------------
●testcopy●

これが動作するのは
Sheet【2】がアクティブな状態で実行する場合です

Sheet【1】がアクティブな状態で実行すると
  Worksheets("sheet2").Range("e5").Select
ここで、問題点(1)の理由によりエラー。
で、先ずシートを選択、次にセルを選択と2段階にしないといけません。

  Worksheets("sheet2").Select
  ActiveSheet.Range("E5").Select

----------------
●testcopy2●

▼Sheet【1】がアクティブな状態で実行
  testcopyと同じ場所、同じ理由でエラー

▼Sheet【2】がアクティブな状態で実行
  Worksheets("sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy
  ここで、問題点(2)により、エラー。
 
 Cellsの前にシートオブジェクトがないので
 Cells(3, 2), Cells(10, 3)はアクティブなSheet【2】のセルとみなされ
 (★実際はちょと違う場合もありますが今回はそう★)

 Worksheets("sheet1").Range(  ← Sheet【1】
 Cells(3, 2), Cells(10, 3))   ← Sheet【2】

このようにSheet【1】【2】が混在していることになり、エラー
で、Cellsの前にシートを付加してセルがどのシートのセルか明示してやる

Worksheets("sheet1").Range(Worksheets("sheet1").Cells(3, 2), Worksheets("sheet1").Cells(10, 3)).Copy
  
---------------------------------
で、質問者のコードを修正すると
'-------------
Sub testcopy()
 Worksheets("sheet1").Range("B3:C10").Copy
 With Worksheets("sheet2")
   .Select
   .Range("E5").Select
   .Paste
 End With
End Sub
'-------------

Sub testcopy2()
 With Worksheets("sheet1")
   .Range(.Cells(3, 2), .Cells(10, 3)).Copy
 End With
 With Worksheets("sheet2")
   .Select
   .Range("E5").Select
   .Paste
 End With
End Sub
'--------------

●ただ今回のような単純なコピーの場合は
 既出の回答にあるようにSelectなしで書くのがふうつです。
'-----------
Sub testcopy111()
 Worksheets("sheet1")
   .Range("B3:C10").Copy Worksheets("sheet2").Range("E5")
 End With
End Sub
'-----------
Sub testcopy222()
 Worksheets("sheet1")
  .Range(.Cells(3, 2), .Cells(10, 3)).Copy Worksheets("sheet2").Range("E5")
 End With
End Sub
'-----------

今回の件は重要事柄ですので覚えておきましょう。
以上です。
 

>testcopyは動きますが、testcopy2は動きません

testcopyは「動作したり、しなかったりする」が正しい表現です。
  要するに今回testcopyが動いたのは▼たまたま▼ということです。

testcopy2 は当然ながらエラーになります。
何れにしろ、両方ともに問題があるということです。
その問題点は2つあります。

(1)アクティブでないシートのセルはSelect(Activate)できない
(2)複数のシートを扱うときのセルの参照は
   そのセルがどのシートのセルなのか明示する必要がある


これを踏まえて、、、、
-...続きを読む

Qマクロ(Excel2007)を他のファイルで使う方法(マクロ初心者です

マクロ(Excel2007)を他のファイルで使う方法(マクロ初心者です。)

Excel2007の「4月」というファイルに印刷ボタンが作られており、
以下のマクロが登録されていました。

Sub 非表示(2)()
'
' 非表示(2) Macro
'

'
Rows("130:193").Select
Selection.EntireRow.Hidden = True
ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"
Selection.EntireRow.Hidden = False
Range("A1").Select
End Sub

「4月」ファイルを新しく「5月」ファイルとして名前を付けて保存したのですが、
どうやら、マクロ有効ブックとして保存していなかったらしく、
マクロが消えてしまっていました。

「5月」ファイルの印刷ボタン(オブジェクト)を選択して
 右クリック→マクロの登録
から、「4月」ファイルの当該マクロを選択して登録したところ、
「5月」ファイルの印刷ボタンを押すたびに「4月」ファイルが開いてしまいます。

これは、「4月」ファイルに保存されているマクロを読みにいってしまっているから。
ということになるのでしょうか?

このマクロを「5月」ファイルに保存して使用するにはどのようにすればよいか、
教えて頂ければ幸いです。

マクロ(Excel2007)を他のファイルで使う方法(マクロ初心者です。)

Excel2007の「4月」というファイルに印刷ボタンが作られており、
以下のマクロが登録されていました。

Sub 非表示(2)()
'
' 非表示(2) Macro
'

'
Rows("130:193").Select
Selection.EntireRow.Hidden = True
ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"
Selection.EntireRow.Hidden = False
Range("A1").Select
End Sub

「4月」ファイルを新しく「5月」ファイルとして名前を付けて保存したのですが...続きを読む

Aベストアンサー

ご質問の直接の回答としては
4月ブックを開く
5月ブックも開く
ALT+F11を押す
現れた画面でプロジェクトエクスプローラを見る
VBAProject(4月.xlsm)の中を開くとModule1などのような名前のモノが入っているので,
そのままVBAProject(5月.xlsm)にドラッグすると引っ越せる
ブックに戻り,5月のボタンにマクロの登録で5月のブックのマクロを設定する
と出来ます。

でもそんなマニアな事をしなくても,
1.4月ブックを開く
2.名前を付けて保存で5月のブックの名前で保存し直す
  勿論マクロ有効ブックにして保存すること
3.5月の本番データを新調した5月ブックにコピーして貼り込む
以上で十分です。今後さらに6月や7月ブックを増やしていくときも同じです。

QRange("K" & TR).Formula = で、セルにマクロで式を書きたいのですが

よろしくお願いします。いつもgooの皆さんには大変お世話になっています
エクセルは2013です

わけあって、セルにマクロで式を書いています
例えば TRは行を表す変数ですが
Range("K" & TR).Formula = "=IFERROR(AY" & TR & ","""")" と書いたマクロの結果は
=IFERROR(AY43,"") という式がRange("K" & TR) に書かれます

それでは、いま、マクロで下記のように書いているコード(TRは行を表す変数です)
Range("Z" & i) = Range("Z" & i - 1) - Range("AG" & TR) * 10000 は
Range("Z" & i).Formula = 
で書く場合、=の右側をどう書いたら良いでしょうか

色々とやってみたのですが狙った式になりません

この場合 変数 i を使っているので、もしかしたら、そもそも無理なことでしょうか

うまく説明できていませんがよろしくお願いします

Aベストアンサー

No.1です。申し訳ありません大ボケな回答をしていましました。

要するに↓ってことですよね? また勘違いしていたらスミマセン。

Range("Z" & i).Formula = "=Z" & i - 1 & "-AG" & TR & " * 10000"

Qコピペマクロを高速化したい(Excel)

見よう見まねで以下のようなコードを書いてみたのですが、
これだと表示にやや時間がかかるので改善したいです。

------
Sub コピペ()

Dim i As Long
i = Range("A1")

Range("C12").Value = Worksheets("sheet2").Cells(i, 2).Value
Range("D12").Value = Worksheets("sheet2").Cells(i, 3).Value
Range("E12").Value = Worksheets("sheet2").Cells(i, 4).Value
Range("F12").Value = Worksheets("sheet2").Cells(i, 5).Value
Range("G12").Value = Worksheets("sheet2").Cells(i, 7).Value
------

こんな感じでコピペしたい値があと15個くらいあります。
コピー元とコピー先のセル配置には法則性があまりありません。
よろしくお願いします。

見よう見まねで以下のようなコードを書いてみたのですが、
これだと表示にやや時間がかかるので改善したいです。

------
Sub コピペ()

Dim i As Long
i = Range("A1")

Range("C12").Value = Worksheets("sheet2").Cells(i, 2).Value
Range("D12").Value = Worksheets("sheet2").Cells(i, 3).Value
Range("E12").Value = Worksheets("sheet2").Cells(i, 4).Value
Range("F12").Value = Worksheets("sheet2").Cells(i, 5).Value
Range("G12").Value = Worksheets("sheet2").Cells(i, 7).Value
------

こ...続きを読む

Aベストアンサー

そのマクロで「遅いと感じられる」のでしたら、それはマクロのせいじゃなくシートの問題と考えられます。

#あるいはご相談に関係ないと思って掲示しなかった箇所のマクロが実は遅い直接の原因なのかも?しれませんが、それはこのご相談ではどーしようもない範疇なので、そういう事は無いとします。


対処の例:
sub macro1()
 dim i as long
 i = range("A1")

 application.calculation = xlcalculationmanual
 range("C12:F12").value = worksheets("Sheet2").cells(i, "B").resize(1, 4).value
 range("G12").value = worksheets("Sheet2").cells(i, "G").value
 application.calculation = xlcalculationautomatic

end sub
みたいなカンジで、再計算を抑制して効果があるか見てみます。

QVBA マクロ実行時エラー’1004RangeクラスのPasteSpecialメソッドが失敗

マクロ実行時に、エラー’1004RangeクラスのPasteSpecialメソッドが失敗と表記され、マクロが実行されません。

マクロの内容は、任意の範囲をコピー、新規book追加し、
新規bookに(1)Paste:=xlPasteValues (2)Paste:=xlPasteColumnWidths (3)Paste:=xlPasteFormats の順に貼り付けし保存するものです。

いろいろ調べては見たのですが、当方初心者の為、わからずじまいです。お手数ではございますが、どなたかご教授願います。
下記にマクロ内容全部記載します。
よろしくお願いします。

*********************************************************
*********************************************************
Sub 日報別ファイルに保存したい1()
Worksheets("日報").Range("A3:AF36").Copy
With Workbooks.Add
Cells.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Cells.Select
Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False

ApplicationDisplayAlerts = True '同名FILEが存在する場合'
ActiveWorkbook.SaveAs Filename:= _
"c:\日報\" & ActiveSheet.Range("J2") & "年" & ActiveSheet.Range("l2") & "月" & ActiveSheet.Range("n2") & "日_日報.xls" _
, FileFormat:=xlNormal
.Close file


End With

End Sub

マクロ実行時に、エラー’1004RangeクラスのPasteSpecialメソッドが失敗と表記され、マクロが実行されません。

マクロの内容は、任意の範囲をコピー、新規book追加し、
新規bookに(1)Paste:=xlPasteValues (2)Paste:=xlPasteColumnWidths (3)Paste:=xlPasteFormats の順に貼り付けし保存するものです。

いろいろ調べては見たのですが、当方初心者の為、わからずじまいです。お手数ではございますが、どなたかご教授願います。
下記にマクロ内容全部記載します。
よろしくお願いします。

***********...続きを読む

Aベストアンサー

こんにちは。

>結果、「ThisWorkbook」上の下記のマクロを削除すると、正常に動きだしました。
それは、Copy 範囲が、消えてしまうことで、PasteSpecial が利かなくなってしまうからです。

まず、シート名の長いコードは、これだけでよいはずです。

Private Sub Workbook_Activate()
 Select Case StrConv(Trim(ActiveSheet.Name), vbNarrow)
 Case "1" To "30", "日報"
  Application.Calculation = xlCalculationManual
 End Select
End Sub


-------------------------------------------
''もし、そのままでダメでしたら、 ' Application.EnableEvents = False 'イベントの介入を阻止する のところのコメント・ブロック('コードの手前のアポストロフィ)を外して、再度試してみてください。

Sub 日報別ファイルに保存したい2()
Dim myRng As Range
Set myRng = Worksheets("日報").Range("A3:AF36")
 ' Application.EnableEvents = False 'イベントの介入を阻止する

With Workbooks.Add
  myRng.Copy
 .ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteValues, _
             Operation:=xlNone, SkipBlanks:=False, Transpose:=False
  myRng.Copy
 .ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteColumnWidths, _
             Operation:=xlNone, SkipBlanks:=False, Transpose:=False
  myRng.Copy
 .ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteFormats, _
             Operation:=xlNone, SkipBlanks:=False, Transpose:=False
 
  Application.CutCopyMode = False
 
 ApplicationDisplayAlerts = True '**これは、そのままでは必要ないはずです。'
 
 ActiveWorkbook.SaveAs Filename:="c:\日報\" & ActiveSheet.Range("J2") & "年" & _
                 ActiveSheet.Range("l2") & "月" & _
                 ActiveSheet.Range("n2") & "日_日報.xls", _
                 FileFormat:=xlNormal
 .Close file
End With
Set myRng = Nothing
'Application.EnableEvents = True 'イベントマクロの活動を戻す

End Sub

こんにちは。

>結果、「ThisWorkbook」上の下記のマクロを削除すると、正常に動きだしました。
それは、Copy 範囲が、消えてしまうことで、PasteSpecial が利かなくなってしまうからです。

まず、シート名の長いコードは、これだけでよいはずです。

Private Sub Workbook_Activate()
 Select Case StrConv(Trim(ActiveSheet.Name), vbNarrow)
 Case "1" To "30", "日報"
  Application.Calculation = xlCalculationManual
 End Select
End Sub


-----------------------------------------...続きを読む

Q会社のExcel97で作成したファイルが自宅のExcel97で開けません(悲)

友人の事なんですが皆様よろしくお願いします。長い説明です、すみません。

友人が会社で作成したExcel97のファイルが自宅のパソコンのExcel97で開けなくてエラーが出るのです。そのエラーとは、

「○(の中に×)プリンタが組み込まれていません。コントロールパネルの[設定]-[プリンタ]コマンドでプリンタを読み込んでください。」

と出るのです。取り合えずキャンセルをクリックするのですが、次のようなエラーが又出てしまって困っています。

「コントロールパネルを確認して下さい。既定値のプリンタでエラーが発生した為、印刷できませんでした。原因として幾つかの理由が考えられます。……」

と長い文章のメッセージが出てしまいます。
友人はプリンタを持っておりませんし、マイクロソフトのWebサイトでも必要とする「構成」の説明のところには「プリンタ」が必須とは書いて有りませんでしたし…。
友人としては、自宅で書き込んで会社で印刷するのだそうです。

ただ友人が言いますのには、会社ではLanか何かでプリンタは繋がっているのだそうです。
あと会社での文書(ファイル)作成時には印刷する大きさの青い(ブルー)の枠の中に打ち込んで(書き込んで?)いるのだそうです。

会社のマシンにはWindowsMeが入っているそうで、友人のマシンにはWindows98SEが入っています。
そうそう友人は、Office97からインストゥールしたって言っていました。

友人のマシンは、Athlon1.0GHz,DIMM512MB,GeForce2MX 32MB,Onbord sound,Modem56k(PCI)がおおよその構成です。私が一年前ほどからWin機を使っていたので、つい最近友人を手伝って自作・組み立てた物です。

友人は、仕事の為にMacから乗り換えたので「Win機は解り難い」って言っていましてExcel(Office)97も初めて、私も自作をほんの少し知っている程度で、勿論Excel&Officeも初めて友人宅で触りました。

友人の事なんですが皆様よろしくお願いします。長い説明です、すみません。

友人が会社で作成したExcel97のファイルが自宅のパソコンのExcel97で開けなくてエラーが出るのです。そのエラーとは、

「○(の中に×)プリンタが組み込まれていません。コントロールパネルの[設定]-[プリンタ]コマンドでプリンタを読み込んでください。」

と出るのです。取り合えずキャンセルをクリックするのですが、次のようなエラーが又出てしまって困っています。

「コントロールパネルを確認して下さい。既定値のプリンタ...続きを読む

Aベストアンサー

プリンタを使用しなくても、プリンタは設定しておいたほうがいいですよ。

スタートメニュー/設定/プリンタで一覧表示してプリンタが1つも無い状態だと「印刷プレビュー」等の機能が使用できません。
そこで、プリンタを使わない場合、なんでもいいから適当にプリンタを設定しておきます。

<設定方法>
スタートメニュー/設定/プリンタでプリンタの追加をダブルクリックし、あとは指示にしたがって進めていきます。
プリンタはCanon LBP-740等を適当に選択しておきます。
最後にテスト印刷をするか聞いてくるので「いいえ」を選択します。

QExcelマクロでRange("A1:A5,C1:C5")をCellsで書きたいのですが

マクロ初心者です。
Excelマクロでグラフを作成するときに、元データを指定する所で、
Source:=Range("A1:A5,C1:C5")とするような場合、
「A1」とかアルファベットでの番地指定ではなく、
Cellsを用いて書きたいのです。

Source:=Range("A1:A5")であれば、
Source:=Range(Cells(1, 1), Cells(5, 1))と書けばいいことは分かるのですが、範囲指定を複数にする場合が分からないのです。

よろしくお願いします。

Aベストアンサー

Unionを使用したらできると思います。

Source:=Union(Range(Cells(1, 1), Cells(5, 1)), Range(Cells(1, 3), Cells(5, 3)))

今Excelがインストールされてないパソコンで作業していないので確認はしていないのですが・・・。

よかったら参考にして下さい

QマクロLOOP文を別方法で高速化

シート2のボタンをクリックすると
Sub 編集が起動します。
Sub 編集にはCallで2種類のプロシージャーを
呼び出します。
シート1には約20,000行のデータがあります。
処理に約2分かかっています。
もう少し高速にする方法は
有りますでしょうか?
プロシージャーは分けておきたいです。
シートに式は入れたくありません。
Sub 編集にはCall文でさらに別のプロシージャーを5個呼び出しますが
F8キーで確認すると、それらは秒速で処理されてました。
一番時間がかかっているのがこの部分なので
この部分を対策したいです。
よろしくお願いします。

Sub 編集()

 Call 検索キー
 Call 日付02

  Sheets("シート1").Select
  Range("R1") = "キー"
  Range("S1") = "日付"
  Columns("B:B").Select
  Selection.Delete Shift:=xlToLeft
  Columns("F:F").Select
  Selection.Delete Shift:=xlToLeft
  Columns("H:O").Select
  Selection.Delete Shift:=xlToLeft
  Range("A1").Select
  MsgBox "編集終了"
  Sheets("シート2").Select
End Sub


  Sub 検索キー()
   '2010年11月17日
   'R列にC,D,E列を連結させた値を転記
    Sheets("シート1").Select
    行 = 2
    Do
    If Cells(行, 1).Value = "" Then Exit Do
    Cells(行, 18).Value = Cells(行, 3) & Cells(行, 4) & Cells(行, 5)
    行 = 行 + 1
    Loop
   End Sub


   Sub 日付02()

    '2010年11月17日
    'A列の値、半角数字8桁を下4桁で
    '2桁目に/を入れてS列に転記(セルの値もセル表示も)
    '例:A列20101117 S列 11/17
    'セルの値が2010/11/17でセルの表示が11/27は不可

     Sheets("シート1").Select
     For 行 = 2 To Cells(Rows.Count, "A").End(xlUp).Row
     With Cells(行, 19)
     .NumberFormat = "@"
     .Value = Format(Cells(行, 1), "!@@/@@")
     End With
     Next
   End Sub

シート2のボタンをクリックすると
Sub 編集が起動します。
Sub 編集にはCallで2種類のプロシージャーを
呼び出します。
シート1には約20,000行のデータがあります。
処理に約2分かかっています。
もう少し高速にする方法は
有りますでしょうか?
プロシージャーは分けておきたいです。
シートに式は入れたくありません。
Sub 編集にはCall文でさらに別のプロシージャーを5個呼び出しますが
F8キーで確認すると、それらは秒速で処理されてました。
一番時間がかかっているのがこの部分なので
この部分を...続きを読む

Aベストアンサー

>..Sub test1を改造して
>これで動きましたが記述があっているか不安です。
あってますよ。
コメントは
>'計算式をA2に入れてコピー。出た値を値貼付
貼付というより
'計算式をA2に入れてコピー。計算式を値化。
がしっくりくるかも。
.Range(..).Value = .Range(..).Value
左辺のセル範囲の.Valueプロパティに右辺のセル範囲の.Valueをセットする、
という認識でいいと思います。

ついでに書いておきますと

Sub test10()
  Dim mx As Long
  Dim i As Long
  Dim v
  Dim w() As String  '書き出し用

  With Sheets("シート●")
    'D最終行:F2の値を配列に取る
    v = .Range("F2", .Cells(.Rows.Count, 4).End(xlUp)).Value
    mx = UBound(v)
    '必要サイズの配列を準備。
    ReDim w(1 To mx, 1 To 1)
    'Loop処理
    For i = 1 To mx
      w(i, 1) = v(i, 1) & v(i, 2) & v(i, 3)
    Next
    '書き出し
    With .Range("■").Resize(mx)
      .ClearContents
      .NumberFormat = "@"
      .Value = w
    End With
  End With
  Erase w
End Sub

Sub test20()
  Dim mx As Long
  Dim i As Long
  Dim v
  Dim w() As String  '書き出し用

  With Sheets("シート●")
    'A2:A最終行の値を配列に取る
    v = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Value
    mx = UBound(v)
    '必要サイズの配列を準備。
    ReDim w(1 To mx, 1 To 1)
    'Loop処理
    For i = 1 To mx
      w(i, 1) = Format$(v(i, 1), "!@@/@@")
    Next
    '書き出し
    With .Range("■").Resize(mx)
      .ClearContents
      .NumberFormat = "@"
      .Value = w
    End With
  End With
  Erase w
End Sub

20,000行程度だったら
Sub test1改造() と Sub test10() は速度的には大差ないと思います。

>..Sub test1を改造して
>これで動きましたが記述があっているか不安です。
あってますよ。
コメントは
>'計算式をA2に入れてコピー。出た値を値貼付
貼付というより
'計算式をA2に入れてコピー。計算式を値化。
がしっくりくるかも。
.Range(..).Value = .Range(..).Value
左辺のセル範囲の.Valueプロパティに右辺のセル範囲の.Valueをセットする、
という認識でいいと思います。

ついでに書いておきますと

Sub test10()
  Dim mx As Long
  Dim i As Long
  Dim v
  Dim w() As String  '書き出し...続きを読む

Qエクセルのマクロ(range)について

マクロの作りと理解の方法について教えてください。

今、日報を作り直しています。
以前作成した方は、このように作っていました。


Worksheets("日報").Select
Range("Q7:Q23").Value = Range("U7:U23").Value
Range("S7:S59").Value = Range("V7:V59").Value
Range("A1").Select
MsgBox " 転写を終了しました。"
End Sub


マクロでは複数の行列を指定していますが、1行だけ表すと、
具体的な表とデータの変化の仕方とするとこのようになっています。

M    O    Q     S       U     V
個数 金額  累計個数 金額金額 (=M+Q) (=O+S)
0、   0、   100、   1000、    100、   1000 
1,初期状態

10、  100、  100、   1000、    110、   1100
2,個数を入力すると、計算式を入力してあるUとVの数が変わる

10、  100、   110、   1100、    120、   1200
3,マクロを実行すると、UとVの数がQとSに入力され、計算式を入力してあるUとVの数がさらに変わる。

0、   0、    110、   1100、   110、    1100
4,MとOの数をゼロ(クリア)にすると、計算式を入力してあるUとVの数が変わる。     


なかなか理解できないのは、Range("Q7:Q23").Value = Range("U7:U23").Valueの部分で、
2,の後にマクロを実行すると、U 110、V 1100がQ 100とS 1000に書き込まれることです。
通常の計算式だと=は対象となったセルをそのまま表示していると思うのですがのですが、
マクロに書いてある式だと3,のところでUとVの数をQとSに書き込んであります。
なぜ=なのにマクロでは一方のセルに数を書き込んでいるのでしょうか。
また、QやSをUやVへ書き込んでいないのでしょうか。

どなたか詳しく教えていただけると幸いです。

マクロの作りと理解の方法について教えてください。

今、日報を作り直しています。
以前作成した方は、このように作っていました。


Worksheets("日報").Select
Range("Q7:Q23").Value = Range("U7:U23").Value
Range("S7:S59").Value = Range("V7:V59").Value
Range("A1").Select
MsgBox " 転写を終了しました。"
End Sub


マクロでは複数の行列を指定していますが、1行だけ表すと、
具体的な表とデータの変化の仕方とするとこのようになっています。

M    O    Q     S...続きを読む

Aベストアンサー

プログラミング言語では、一般的に、
「=」は、右辺から左辺への「代入」
を意味します。

マクロ = Visual Basic = プログラミング言語
なので、Excelにおける「=」とは少し意味合いが違っています。

Qエクセルでハイパーリンクを連続的に設定する方法(マクロをなるべくなら使わない方法)

エクセルでハイパーリンクを設定し、PDFファイルが開くように設定するのですが、

  エクセルのセル   リンク先

  A0001     ⇒ \ディレクトリ\A0001.pdf
  A0002     ⇒ \ディレクトリ\A0002.pdf
  ・・・

というようになっているので、一つ一つリンク先を入力しないで、自動で連続的にリンク先を設定することはできるでしょうか?
マクロを使ったことがないので、マクロを使ってしかできない場合は、その方法を教えてください!!!!

Windows2000/Office2000 使用

Aベストアンサー

こんにちは。maruru01です。

A1に、

=HYPERLINK("\ディレクトリ\A" & TEXT(ROW(),"0000") & ".pdf")

と入力して、下の行へコピー
ということでしょうか。


人気Q&Aランキング

おすすめ情報