Excel/VBに小さなスクリプトがあり、それを動作させようとしています。コピーするデータのダイナミックレンジを選択するだけですが、グリッドデータ(A11など)を取得する方法に関するヘルプ/コードが見つかりません。
以下は、データの範囲を選択するマクロ記録からのコードです。
_Range("D291:D380").Select
_
私はRange(Current).Select
または何かができると期待していたが、それはうまくいかない。
どんな助けも大歓迎です。
やってみました:
1つのセルの場合:
ActiveCell.Select
複数の選択されたセルの場合:
Selection.Range
例えば:
Dim rng As Range
Set rng = Range(Selection.Address)
キーワード「Selection」はすでにvba Rangeオブジェクトであるため、直接使用できます。コピーするセルを選択する必要はありません。たとえば、Sheet1で次のコマンドを発行できます。
ThisWorkbook.worksheets("sheet2").Range("namedRange_or_address").Copy
ThisWorkbook.worksheets("sheet1").Range("namedRange_or_address").Paste
複数選択の場合、forループでAreaオブジェクトを使用する必要があります。
Dim a as Range
For Each a in ActiveSheet.Selection.Areas
a.Copy
ThisWorkbook.worksheets("sheet2").Range("A1").Paste
Next
よろしく
トーマス
動的に生成された文字列で範囲を取得しようとしている場合は、次のように文字列を作成する必要があります。
Range(firstcol & firstrow & ":" & secondcol & secondrow).Select
これはあなたの質問に直接答える助けにはならないかもしれませんが、あなたを助けてくれるかもしれないダイナミックレンジで作業しようとするとき、私は有用だと感じました。
ワークシートのセルA1:C3に100〜108の数字があるとします。
A B C
1 100 101 102
2 103 104 105
3 106 107 108
次に、すべてのセルを選択するには、CurrentRegion
プロパティを使用できます。
Sub SelectRange()
Dim dynamicRange As Range
Set dynamicRange = Range("A1").CurrentRegion
End Sub
これの利点は、新しい行または列を番号のブロック(109、110、111など)に追加すると、CurrentRegionは常に拡大された範囲(この場合はA1:C4)を参照することです。
VBAコードでCurrentRegionをかなり使用しましたが、動的なサイズの範囲で作業するときに最も便利です。また、コードの範囲をハードコードする必要がなくなります。
最後に、私のコードでは、A1をCurrentRegionの参照セルとして使用したことがわかります。また、どのセルを参照しても機能します(たとえば、A1をB2に置き換えてみてください)。理由は、CurrentRegionは参照セルに基づいてすべての連続したセルを選択するからです。
これを試して
Dim app As Excel.Application = Nothing
Dim Active_Cell As Excel.Range = Nothing
Try
app = CType(Marshal.GetActiveObject("Excel.Application"), Excel.Application)
Active_Cell = app.ActiveCell
Catch ex As Exception
MsgBox(ex.Message)
Exit Sub
End Try
' .address will return the cell reference :)
私はこれが質問のタイトルから直接適用されないことを理解していますが、可変範囲に対処するいくつかの方法は、コードが実行されるたびに範囲を選択することです-特にユーザーが選択した範囲に興味がある場合。そのオプションに興味がある場合は、Application.InputBoxを使用できます(公式ドキュメントページ here )。オプション変数の1つは「タイプ」です。タイプが8に設定されている場合、InputBoxにはExcelスタイルの範囲選択オプションもあります。コードでの使用例は次のとおりです。
Dim rng as Range
Set rng = Application.InputBox(Prompt:= "Please select a range", Type:=8)
注:
InputBoxの値を、範囲ではなく、範囲なしの変数(Set
キーワードなし)に割り当てると、以下のコードのように、範囲の値が割り当てられます(ただし、状況によっては、値をバリアントに割り当てる必要があります):
Dim str as String
str = Application.InputBox(Prompt:= "Please select a range", Type:=8)