□技術メモ - Excel VBA ※管理人の個人的な技術メモです。サンプルソースを実行した結果について 管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。 ----------------------------------------------------------- ○セルの座標形式変換 '数値表記をアルファベット表記に変換 'Addressの引数 '第1引数 TrueならRowが絶対座標($が付く) '第2引数 TrueならColumnが絶対座標($が付く) Sub ConvToAdrs() Dim strAdrs1, strAdrs2 As String Dim x, y As Integer y = 1: x = 5 strAdrs1 = Cells(y, x).Address(False, True ) '"$E1" strAdrs2 = Cells(y, x).Address(True, False) '"E$1" End Sub ○ClipBoard経由で値のみコピーする Destinationを指定しない場合はClipBoard経由となり、こちらの方が処理が速い。 (例1) ActiveWorkbook.Worksheets("Sheet1").Range("A1:IV3000").Copy ActiveWorkbook.Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlValues ただし、上記の例では実行時に使用した領域が開放されないので、 コピーのサイズが大きい場合にOutOfMemoryが発生する可能性がある。 RangeとWorkSheetを変数に持てば明示的に開放することができる。 画面更新の抑止なども行った場合のソースは以下の通り。 (例2) Dim sh1 As Worksheet Dim sh2 As Worksheet set sh1 = ActiveWorkbook.Worksheets("Sheet1") set sh2 = ActiveWorkbook.Worksheets("Sheet2") Dim rng1 As Range Dim rng2 As Range Set rng1 = sh1.Range(sh1.Cells( 1, 1), sh1.Cells( 10,20)) Set rng2 = sh2.Range("A1") Application.ScreenUpdating = False '画面更新の抑止 rng1.Copy rng2.PasteSpecial Paste:=xlValues Application.ScreenUpdating = True Application.CutCopyMode = False 'コピー元の範囲指定解除 set rng1 = Nothing '開放 set rng2 = Nothing '開放 set sh1 = Nothing '開放 set sh2 = Nothing '開放 ただしセル数が多い場合はExcel2010では使用メモリが急上昇してOutOfMemoryが発生してしまいます。 何回かに分けてコピーしたり、Nothingの後にDoEventsを実行したりしてみたり、試行錯誤してみたのですが、 1回の操作で扱うセル数が多い場合はやはりOutOfMemoryが発生してしまいます。 Excel2010より前は発生しなかったので、内部の処理やデータの持ち方が変わったのかもしれません。 ○Destinationを指定する場合 処理はかなり遅いのですが、 ClipBoardを使用しないため使用するメモリを低く抑えて処理を継続できるので 夜間バッチなどには向いていると思います(使用する局面があるかはわかりませんが) 対話型の処理で大きな領域のコピー等を行う場合には不向きかもしれません。 ActiveWorkbook.Worksheets("Sheet1").Range("A1:A10").Copy _ Destination:=ActiveWorkbook.Worksheets("Sheet2").Range("D1") ○Valueプロパティを使用する場合 Range.copyの際にDestinationとxlPasteValueを両方は指定できないようですが、 Valueプロパティを使用して値のみコピーできます。 ただしセル全部をコピーするより処理が遅い。(おそらく書式適用の処理が走っている) メモリの使用量も急上昇するので大きな範囲のコピーにはおすすめしません。 ActiveWorkbook.Worksheets("Sheet1").Range("D1:D10").Value = _ ActiveWorkbook.Worksheets("Sheet1").Range("A1:A10").Value ○ClipBoardをクリアする Range.CopyのHelpにはClipBoardに関する記述がありますが、WindowsのClipBoardを開放しても、 OfficeのClipBoardを開放してもRange.Copyで使用した領域は開放されないようです。 ヒープにコピーしてきた最後の領域をHelp内ではClipBoardという言い方をしているのかもしれません。 そもそもClipBoardの定義って何?ということもあります。いろいろと謎が多いです。