1. ホーム
  2. エクセル

[解決済み】Excel VBAでSelectを使用しないようにする方法

2022-04-16 17:46:58

質問

を使うのが嫌だという話はよく聞きます。 .Select のExcel VBAで、これを使わないようにするにはどうしたらいいか迷っています。しかし、どうすれば使わないで済むのかがわかりません。 Select 関数を使用します。しかし、どのように参照すればよいのかがわかりません。 ActiveCell を使用しない場合は Select .

を発見しました。 レンジに関するこの記事 selectを使用しない場合の利点に関するこの例 に関するものは見当たりません。 どのように .

解決方法は?

セレクトを回避するためのいくつかの例

使用する Dim d変数

Dim rng as Range

Set を必要な範囲に設定します。単一セルの範囲を参照する方法はたくさんあります。

Set rng = Range("A1")
Set rng = Cells(1, 1)
Set rng = Range("NamedRange")

または複数セルの範囲。

Set rng = Range("A1:B10")
Set rng = Range("A1", "B10")
Set rng = Range(Cells(1, 1), Cells(10, 2))
Set rng = Range("AnotherNamedRange")
Set rng = Range("A1").Resize(10, 2)

あなた できる へのショートカットを使用します。 Evaluate しかし、これはあまり効率的ではなく、一般に実運用コードでは避けるべきでしょう。

Set rng = [A1]
Set rng = [A1:B10]

上記の例はすべて アクティブシート . アクティブなシートのみで作業したい場合以外は、Dim Worksheet という変数もあります。

Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set rng = ws.Cells(1, 1)
With ws
    Set rng = .Range(.Cells(1, 1), .Cells(2, 10))
End With

もし、あなたが する で作業したい。 ActiveSheet というように、明示した方が分かりやすい。しかし、いくつかの Worksheet メソッドは、アクティブなシートを変更します。

Set rng = ActiveSheet.Range("A1")

ここでも アクティブなワークブック . 特に ActiveWorkbook または ThisWorkbook を使用したほうがよいでしょう。 Workbook という変数もあります。

Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")

もし、あなたが する で作業したい。 ActiveWorkbook というように、明示した方が分かりやすい。しかし、多くの WorkBook メソッドは、アクティブなブックを変更します。

Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")

を使用することもできます。 ThisWorkbook オブジェクトを使用して、実行中のコードを含むブックを参照することができます。

Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")

よくある(悪い)コードは、ブックを開いてデータを取得し、再び閉じるというものです。

これはまずい。

Sub foo()
    Dim v as Variant
    Workbooks("Book1.xlsx").Sheets(1).Range("A1").Clear
    Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
    v = ActiveWorkbook.Sheets(1).Range("A1").Value
    Workbooks("SomeAlreadyOpenBook.xlsx").Activate
    ActiveWorkbook.Sheets("SomeSheet").Range("A1").Value = v
    Workbooks(2).Activate
    ActiveWorkbook.Close()
End Sub

といった感じでいいのではないでしょうか。

Sub foo()
    Dim v as Variant
    Dim wb1 as Workbook
    Dim  wb2 as Workbook
    Set wb1 = Workbooks("SomeAlreadyOpenBook.xlsx")
    Set wb2 = Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
    v = wb2.Sheets("SomeSheet").Range("A1").Value
    wb1.Sheets("SomeOtherSheet").Range("A1").Value = v
    wb2.Close()
End Sub

に範囲を渡します。 SubFunction をRange変数とする。

Sub ClearRange(r as Range)
    r.ClearContents
    '....
End Sub

Sub MyMacro()
    Dim rng as Range
    Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:B10")
    ClearRange rng
End Sub

また、Methods を適用する必要があります。 FindCopy ) を変数に変換します。

Dim rng1 As Range
Dim rng2 As Range
Set rng1 = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10")
Set rng2 = ThisWorkbook.Worksheets("SomeSheet").Range("B1:B10")
rng1.Copy rng2

セルの範囲をループする場合、まず範囲の値を変量配列にコピーして、それをループする方が良い(速い)ことが多い。

Dim dat As Variant
Dim rng As Range
Dim i As Long

Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10000")
dat = rng.Value  ' dat is now array (1 to 10000, 1 to 1)
for i = LBound(dat, 1) to UBound(dat, 1)
    dat(i,1) = dat(i, 1) * 10 ' Or whatever operation you need to perform
next
rng.Value = dat ' put new values back on sheet

これは、何が可能かを示す小さなテイスターです。