programing

Excel VBA에서 Select를 사용하지 않는 방법

linuxpc 2023. 3. 22. 20:48
반응형

Excel VBA에서 Select를 사용하지 않는 방법

저는 이 제품을 사용하는 것에 대해 이해할 수 있는 혐오감에 대해 많이 들어왔습니다..SelectExcel VBA에서 사용할 수 있지만 어떻게 하면 어떻게 해야 할지 모르겠습니다.가 변수를 할 수 내 가 더 수 것을 될 것이다.Select 모르겠어요.ActiveCell, 를 경우는, 「」를 참조해 주세요.Select.

기사는 범위에 관한 기사이고, 이는 Select를 사용하지 않을 경우의 이점에 관한 것입니다만, 그 방법에 대해서는 찾을 수 없습니다.

선택을 회피하는 방법의 몇 가지 예

Dim variablesd 변변

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 a 를 사용해 주세요.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 a, dim a, dim a, dim a를 하는 것이 좋습니다.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

를 전달해 주세요.Sub §Function 변수 s as 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)도 적용해야 .Find ★★★★★★★★★★★★★★★★★」Copy에서 변수서서: :

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

이것은 가능한 것에 대한 작은 맛보기이다.

「 」의 이유는, 「 」의 입니다..Select,.Activate,Selection,Activecell,Activesheet,Activeworkbook, 합니다.

  1. 암호가 느려집니다.
  2. 통상, 런타임 에러의 주된 원인입니다.

어떻게 피하지?

1) 관련 사물을 직접 작업한다.

이 코드를 고려합니다.

Sheets("Sheet1").Activate
Range("A1").Select
Selection.Value = "Blah"
Selection.NumberFormat = "@"

이 코드는 다음과 같이 쓸 수도 있습니다.

With Sheets("Sheet1").Range("A1")
    .Value = "Blah"
    .NumberFormat = "@"
End With

2) 필요한 경우 변수를 선언합니다.위와 같은 코드를 다음과 같이 쓸 수 있습니다.

Dim ws as worksheet

Set ws = Sheets("Sheet1")

With ws.Range("A1")
    .Value = "Blah"
    .NumberFormat = "@"
End With

좋은 답변입니다만, 이 토픽에서는, 실제로 액티브하게 할 필요가 있는 것은 아닙니다.모두가 나쁘다고 하지만, 그것을 사용하는 것이 말이 되는 경우는 아무도 설명하지 않는다.

사용하지 않을 수 없는 상황.Activate/.Select ( 되었을 때 ( 추가) (링크 추가) ( 추가)

  1. 사용자가 워크시트를 볼 수 있도록 사용자에게 워크시트를 표시하는 경우.
  2. Working 매크로와 같은 시나리오에서는 강제로 사용해야 하는 제어에서 실행되면 오류가 반환됩니다..Activate
  3. 통상적인 방법Text To Columns.Formula = .Formula 안 될 수도 요.그러면 수 '안 될 수도 있어요', '안 될 수도 있어요..Select

한 가지 강조할 점은 앞서 설명한 모든 훌륭한 답변에 추가하겠습니다.

Select를 사용하지 않기 위해 할 수 있는 가장 큰 방법은 가능한 한 VBA 코드에서 명명된 범위(의미 있는 변수 이름과 조합) 사용하는 것입니다.이 점은 위에서 언급했지만 다소 얼버무렸지만 특별히 주목할 필요가 있다.

여기에 명명된 범위를 자유롭게 사용해야 하는 몇 가지 추가 이유가 있습니다. 하지만 저는 더 많은 것을 생각할 수 있다고 확신합니다.

명명된 범위를 사용하면 코드를 더 쉽게 읽고 이해할 수 있습니다.

예:

Dim Months As Range
Dim MonthlySales As Range

Set Months = Range("Months")
' E.g, "Months" might be a named range referring to A1:A12

Set MonthlySales = Range("MonthlySales")
' E.g, "Monthly Sales" might be a named range referring to B1:B12

Dim Month As Range
For Each Month in Months
    Debug.Print MonthlySales(Month.Row)
Next Month

알수 있다.Months ★★★★★★★★★★★★★★★★★」MonthlySales을 사용하다

이게 왜 중요하죠?부분적으로는 다른 사람이 이해하기 쉽지만, 코드를 보거나 사용하는 유일한 사람이더라도 명명된 범위와 좋은 변수 이름을 사용해야 합니다. 왜냐하면 1년 후에 코드를 사용하여 무엇을 해야 하는지 잊어버리고 코드가 무엇을 하고 있는지 알아내는 데만 30분을 낭비하게 되기 때문입니다.

지정된 범위를 지정하면 스프레드시트의 구성이 변경되었을 때 매크로가 파손될 가능성이 크게 낮아집니다.

위의 예제가 다음과 같이 작성되었다고 가정해 보겠습니다.

Dim rng1 As Range
Dim rng2 As Range

Set rng1 = Range("A1:A12")
Set rng2 = Range("B1:B12")

Dim rng3 As Range
For Each rng3 in rng1
    Debug.Print rng2(rng3.Row)
Next rng3

즉, 가 " Wiz, 나는 에 새 그것은, 당신이나 장래의 유저가 「Ge Wiz, Column에 연도를 붙여 새로운 컬럼을 추가하려고 합니다.A)" 또는 월과 판매란 사이에 비용란을 넣거나 각 열에 머리글을 추가합니다.제,, 당당당암 암다다다다다다또한 끔찍한 변수 이름을 사용했기 때문에 수정 방법을 찾는 데 필요한 시간보다 훨씬 더 오래 걸립니다.

있는 는, 「」를 해 주세요.Months ★★★★★★★★★★★★★★★★★」Sales원하는 대로 열을 이동할 수 있으며 코드는 계속 정상적으로 작동합니다.

다들 길게 했으니까 짧게 할게요.

선택하다셀 또는 시트를 선택하면 셀 또는 시트만 활성화됩니다.그 시점부터 다음과 같은 조건 없는 레퍼런스를 사용할 때마다Range.Value활성 세포와 시트만 사용합니다.코드 위치를 확인하지 않거나 사용자가 워크북을 클릭하는 경우에도 문제가 발생할 수 있습니다.

따라서 셀을 직접 참조함으로써 이러한 문제를 제거할 수 있습니다.즉, 다음과 같습니다.

'create and set a range
Dim Rng As Excel.Range
Set Rng = Workbooks("Book1").Worksheets("Sheet1").Range("A1")
'OR
Set Rng = Workbooks(1).Worksheets(1).Cells(1, 1)

아니면 할 수 있어

'Just deal with the cell directly rather than creating a range
'I want to put the string "Hello" in Range A1 of sheet 1
Workbooks("Book1").Worksheets("Sheet1").Range("A1").value = "Hello"
'OR
Workbooks(1).Worksheets(1).Cells(1, 1).value = "Hello"

이 방법에는 여러 가지 조합이 있지만, 저처럼 성급한 사람에게는 가능한 한 빨리 표현되는 일반적인 생각입니다.

"... Select 함수 대신 변수를 사용할 수 있다면 코드를 더 재사용할 수 있을 것입니다."

는 '아예'가 '아예'가 '아예'가 '아예'가 '아예'로 되어 있는 할 수 ..Select직접 세포를 참조하는 것보다 더 나은 선택일 것이다, 나는 그것을 옹호할 것이다.Selection는 안 합니다..Select피해야 합니다.

단축키 조합에 할당되어 있는 짧은 시간 절약 매크로 서브루틴을 몇 개의 키를 누르면 많은 시간을 절약할 수 있는 경우가 있습니다.워크시트 전체 데이터 형식에 맞지 않는 포켓형 데이터를 처리할 때 셀 그룹을 선택하여 작업 코드를 제정할 수 있으면 놀라운 결과를 얻을 수 있습니다.셀 그룹을 선택하고 형식 변경을 적용하는 것과 마찬가지로 특별한 매크로 코드를 실행할 셀 그룹을 선택하는 것이 시간을 크게 절약할 수 있습니다.

선택 기반 하위 프레임워크의 예:

Public Sub Run_on_Selected()
    Dim rng As Range, rSEL As Range
    Set rSEL = Selection    'store the current selection in case it changes
    For Each rng In rSEL
        Debug.Print rng.Address(0, 0)
        'cell-by-cell operational code here
    Next rng
    Set rSEL = Nothing
End Sub

Public Sub Run_on_Selected_Visible()
    'this is better for selected ranges on filtered data or containing hidden rows/columns
    Dim rng As Range, rSEL As Range
    Set rSEL = Selection    'store the current selection in case it changes
    For Each rng In rSEL.SpecialCells(xlCellTypeVisible)
        Debug.Print rng.Address(0, 0)
        'cell-by-cell operational code here
    Next rng
    Set rSEL = Nothing
End Sub

Public Sub Run_on_Discontiguous_Area()
    'this is better for selected ranges of discontiguous areas
    Dim ara As Range, rng As Range, rSEL As Range
    Set rSEL = Selection    'store the current selection in case it changes
    For Each ara In rSEL.Areas
        Debug.Print ara.Address(0, 0)
        'cell group operational code here
        For Each rng In ara.Areas
            Debug.Print rng.Address(0, 0)
            'cell-by-cell operational code here
        Next rng
    Next ara
    Set rSEL = Nothing
End Sub

처리하는 실제 코드는 한 줄에서 여러 모듈까지 모두 사용할 수 있습니다.이 방법을 사용하여 외부 워크북의 파일 이름을 포함하는 불규칙한 셀 선택에서 장시간 실행 루틴을 시작했습니다.

컨, 리, 마, 리를 마세요.Selection와 밀접한 관계가 있기 때문에.Select ★★★★★★★★★★★★★★★★★」ActiveCell워크시트 속성으로서 다른 많은 목적을 가지고 있습니다.

이 은 (아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아..Select 아니라, 이에요.Selection하지만 초보 VBA 코더들이 추측할 수 있는 오해를 없애고 싶었습니다.)

Select ★★★★★★★★★★★★★★★★★」ActivateVBA를 사용합니다.으로는, 「 」입니다.Select ★★★★★★★★★★★★★★★★★」Activate할 때 합니다.따라서Parent워크시트 또는 범위는 항상 활성 범위로 간주됩니다.

하면 안 될 것 요.Select ★★★★★★★★★★★★★★★★★」Activate다음과 같은 경우


새 워크시트 추가 및 셀 복사:

시작(매크로 레코더로 생성된 코드):

Sub Makro2()
    Range("B2").Select
    Sheets.Add After:=ActiveSheet
    Sheets("Tabelle1").Select
    Sheets("Tabelle1").Name = "NewName"
    ActiveCell.FormulaR1C1 = "12"
    Range("B2").Select
    Selection.Copy
    Range("B3").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
End Sub

수신인:

Sub TestMe()
    Dim ws As Worksheet
    Set ws = Worksheets.Add
    With ws
        .Name = "NewName"
        .Range("B2") = 12
        .Range("B2").Copy Destination:=.Range("B3")
    End With
End Sub

워크시트 간에 범위를 복사하려는 경우:

송신원:

Sheets("Source").Select
Columns("A:D").Select
Selection.Copy
Sheets("Target").Select
Columns("A:D").Select
ActiveSheet.Paste

수신인:

Worksheets("Source").Columns("A:D").Copy Destination:=Worksheets("Target").Range("a1")

화려한 명명 범위 사용

할 수 방법은 '접근하다'로 접속할 수 있습니다.[]그 반대편에 비하면 정말 아름답죠.접접: :

Dim Months As Range
Dim MonthlySales As Range

Set Months = Range("Months")    
Set MonthlySales = Range("MonthlySales")

Set Months =[Months]
Set MonthlySales = [MonthlySales]

위의 예는 다음과 같습니다.

Worksheets("Source").Columns("A:D").Copy Destination:=Worksheets("Target").[A1]

값을 베끼는 것이 아니라 베끼는 것

할 , 할 의향이 있으면, 할 의향이 있다면,select아마 무언가를 복사하고 있을 것입니다.값에만 관심이 있는 경우 선택을 피하는 것이 좋습니다.

Range("B1:B6").Value = Range("A1:A6").Value


워크시트도 항상 참조하도록 하십시오.

은 아마도 vba에서 가장 흔한 실수일 것입니다.범위를 복사할 때마다 워크시트가 참조되지 않을 수 있으므로 VBA는 잘못된 시트를 ActiveWorksheet로 간주합니다.

'This will work only if the 2. Worksheet is selected!
Public Sub TestMe()
    Dim rng As Range
    Set rng = Worksheets(2).Range(Cells(1, 1), Cells(2, 2)).Copy
End Sub

'This works always!
Public Sub TestMe2()
    Dim rng As Range
    With Worksheets(2)
        .Range(.Cells(1, 1), .Cells(2, 2)).Copy
    End With
End Sub

안 쓸 수 요?.Select ★★★★★★★★★★★★★★★★★」.Activate★★★★★★★★★★★★★★★★?

  • 「 」를 하는 것이 될 수 예..Activate ★★★★★★★★★★★★★★★★★」.Select이 닫혔을하고 커버 워크시트를 먼저이 항상 .예를 들어, Excel은 항상 커버 워크시트를 먼저 선택한 상태에서 열리며, 파일이 닫혔을 때 ActiveSheet 중 어느 것이었는지는 무시됩니다.

따라서 아래 코드와 같은 것으로도 문제 없습니다.

Private Sub Workbook_Open()
    Worksheets("Cover").Activate
End Sub

다음에서는 선택 접근법(OP가 피하고자 하는 접근법)과 범위 접근법(이것이 질문에 대한 답변)을 비교합니다.첫 번째 Select가 표시되었을 때 읽는 것을 멈추지 마십시오.

그것은 정말 당신이 무엇을 하려고 하는가에 달려있다.어쨌든, 간단한 예가 유용할 수 있습니다.액티브 셀의 값을 「foo」로 설정한다고 합니다.ActiveCell을 사용하면 다음과 같이 쓸 수 있습니다.

Sub Macro1()
    ActiveCell.Value = "foo"
End Sub

예를 들어 "B2"와 같이 활성화되지 않은 셀에 대해 이 셀을 사용하려면 먼저 다음과 같이 셀을 선택해야 합니다.

Sub Macro2()
    Range("B2").Select
    Macro1
End Sub

범위를 사용하면 원하는 셀 값을 원하는 대로 설정하는 데 사용할 수 있는 보다 일반적인 매크로를 작성할 수 있습니다.

Sub SetValue(cellAddress As String, aVal As Variant)
    Range(cellAddress).Value = aVal
End Sub

다음으로 Macro2를 다음과 같이 고쳐 쓸 수 있습니다.

Sub Macro2()
    SetCellValue "B2", "foo"
End Sub

Macro1은 다음과 같습니다.

Sub Macro1()
    SetValue ActiveCell.Address, "foo"
End Sub

항상 워크북, 워크시트 및 셀/범위를 기술하십시오.

예를 들어 다음과 같습니다.

Thisworkbook.Worksheets("fred").cells(1,1)
Workbooks("bob").Worksheets("fred").cells(1,1)

최종 사용자는 항상 버튼을 클릭하기만 하면 되기 때문에 워크북에서 포커스가 벗어나자마자 코드가 작동하려는 작업이 완전히 잘못됩니다.

그리고 워크북의 색인을 절대 사용하지 마세요.

Workbooks(1).Worksheets("fred").cells(1,1)

사용자가 코드를 실행할 때 열려 있는 다른 문제집은 알 수 없습니다.

이 방법들은 다소 오명을 남기 때문에, 모래 위에 선을 긋기 위해 Vityata와 Jeeped를 선도합니다.

★★.Activate,.Select,Selection,ActiveSomething(메서드/프로퍼티)

기본적으로 애플리케이션 UI를 통한 사용자 입력을 처리하기 위해 호출되기 때문입니다.즉, UI를 사용하여 이 때문에 액션을 수행하기 위해 오브젝트를 선택할 필요가 없습니다.Selection그 직후에요.

단, 이 정의에 의해 요구된 상황은 다음과 같이 해결됩니다.

" " 를 호출해야 ?.Activate,.Select,.Selection,.ActiveSomething(메서드/프로퍼티)

기본적으로 실행에서 최종 사용자가 역할을 수행할 것으로 예상되는 경우입니다.

할 경우, " " " 를 참조하십시오..Selection ★★★★★★★★★★★★★★★★★」.ActiveObject절합니니다다

반,는.Select ★★★★★★★★★★★★★★★★★」.Activate사용자의 다음 동작을 유추할 수 있고 사용자의 코드로 사용자를 안내할 수 있는 경우에 유용하여 사용자의 시간과 마우스 클릭을 절약할 수 있습니다.들어 수 , 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」에 전화할 수 .을 사용하다.Activate사용자가 검색하는 시간을 절약하거나 사용자가 일부 범위 값을 업데이트해야 하는 경우 해당 범위를 프로그래밍 방식으로 선택할 수 있습니다.

의 IMHO .select 사람이 를 수정하는 등 에 따라 시작한 .select 그 후의 andselection그저 불필요한 중간상인일 뿐입니다.

.select이미 게시된 것처럼, 기존의 오브젝트로 직접 작업함으로써 피할 수 있습니다.이것에 의해, 복잡한 방법으로 i와 j를 계산하고 나서 셀(i,j)을 편집하는 등, 다양한 간접 참조가 가능하게 됩니다.

않으면 것은 ..select을 사용법스프레드시트를 날짜로 채우고 매크로를 활성화하여 다른 시트로 허용 가능한 형식으로 내보냅니다. 단, 최종 수동(예측할 수 없는) 입력이 필요합니다.그래서 지금 이 순간은.select마우스를 더 움직이거나 클릭할 필요가 없습니다.

「 」를 하지 않게 , 「 」를 합니다..Select할 수 .

를 들어, 「」의 는, 「」의 값을 지정합니다.Cell A1변수를 해당 셀의 값 속성과 동일하게 설정할 수 있습니다.

  • »valOne = Range("A1").Value

를 들어 'Sheet3'와 같은 할 수 .Codename츠미야

  • »valTwo = Sheets("Sheet3").Codename

복사 붙여넣기를 피하는 방법

솔직히 말해 매크로를 기록할 때 자주 나타나는 현상입니다.

Range("X1").Select
Selection.Copy
Range("Y9").Select
Selection.Paste

단, 고객이 원하는 것은 다음과 같습니다.

Range("Y9").Value = Range("X1").Value

따라서 VBA 매크로에서 복사 붙여넣기를 사용하는 대신 다음과 같은 간단한 방법을 권장합니다.

Destination_Range.Value = Source_Range.Value

Select 또는 Activesheet를 사용하지 않는 주된 이유는 대부분의 사용자가 매크로를 실행할 때 적어도 몇 권의 워크북을 열 수 있기 때문입니다(때로는 수십 권). 매크로 실행 중에 시트에서 다른 곳을 클릭하여 열려 있는 다른 책을 클릭하면 Activesheet가 변경됩니다.수식되지 않은 "Select" 명령의 대상 워크북도 변경됩니다.

매크로가 크래시되거나 최악의 경우 잘못된 워크북에 값을 쓰거나 셀을 변경할 수 없습니다.

내게는 내가 따르는 간단한 황금 규칙이 있다.워크북 개체와 워크시트 개체에 대해 "wb" 및 "ws"라는 변수를 추가하고 항상 이러한 변수를 사용하여 매크로북을 참조합니다.둘 이상의 책 또는 여러 시트를 참조해야 할 경우 변수를 추가합니다.

예를들면,

Dim wb as Workbook
Dim ws as Worksheet
Set wb = ThisWorkBook
Set ws = wb.sheets("Output")

"Set wb = ThisWorkbook" 명령이 절대적으로 중요합니다."This Workbook"은 Excel의 특별한 가치로, 현재 VBA 코드가 실행되고 있는 워크북을 의미합니다.워크북 변수를 설정하는 데 매우 유용한 바로 가기입니다.

Sub의 상단에서 이 작업을 수행한 후에는 "Selection(선택)"을 사용할 수 있는 모든 위치에서 이 작업을 사용할 수 있습니다.

따라서 "Output"에서 셀 "A1"의 값을 "Hello"로 변경하는 방법은 다음과 같습니다.

Sheets("Output").Activate
ActiveSheet.Range("A1").Select
Selection.Value = "Hello"

이제 이 작업을 수행할 수 있습니다.

ws.Range("A1").Value = "Hello"

따라서 사용자가 여러 스프레드시트를 사용할 경우 훨씬 더 신뢰성이 높고 크래시 가능성이 적을 뿐만 아니라 훨씬 더 짧고, 빠르고, 쓰기 쉽습니다.

추가 보너스로 변수 이름을 항상 "wb" 및 "ws"로 지정하면 한 책에서 다른 책으로 코드를 복사하여 붙여넣을 수 있습니다. 일반적으로 필요한 최소한의 변경만 있으면 작동합니다.

이 답변들 중 어느 것도 에 대해 언급하고 있지 않습니다.오프셋 속성.또한 이 기능을 사용하면,Select셀을 , 셀에 되어 있는 와 같이)ActiveCell를 참조해 주세요.

다음은 몇 가지 예입니다.

저는 ,, 우, 우, 우, 경, i, i, i, i.ActiveCellJ4 입니다.

ActiveCell.Offset(2, 0).Value = 12

  • 셀 이 2행 변경됩니다.activecell(J6)의 값은 12입니다.
  • 마이너스 -2는 값 12를 두 줄 위의 J2에 넣습니다.

ActiveCell.Offset(0,1).Copy ActiveCell.Offset(,2)

  • 그러면 오른쪽(k4)에 있는 셀이 오른쪽(k4)에 있는1개의 컬럼에서2개의 컬럼으로 복사됩니다.activecell(L4).
  • :0오프셋 파라미터에서 생략할 수 있습니다.
    • : ★★★★★★★★★★★★★★:ActiveCell.Offset(,2) is is is is is와 ActiveCell.Offset(0,2)
  • 앞의 예시와 마찬가지로 -1은 왼쪽에 있는 열(i4)입니다.

이는 위의 옵션보다 낫다는 의미는 아니지만, 이 옵션을 사용하는 것보다 확실히 더 낫습니다.select. EXCEL FUNTION Offset은 휘발성 함수이므로 워크시트에서 사용하지 마십시오.

조작부모 기능, 이 예에서는 myRng 참조를 1개만 설정하면 환경 전체에 대한 다이내믹액세스를 newable로 하는 방법을 나타냅니다.선택한다.작동시키다.액티브 셀,ActiveWorkbook, .ActiveSheet 등 (일반적인 것은 없습니다).자기능).

Sub ShowParents()
    Dim myRng As Range
    Set myRng = ActiveCell
    Debug.Print myRng.Address                    ' An address of the selected cell
    Debug.Print myRng.Parent.name                ' The name of sheet, where MyRng is in
    Debug.Print myRng.Parent.Parent.name         ' The name of workbook, where MyRng is in
    Debug.Print myRng.Parent.Parent.Parent.name  ' The name of application, where MyRng is in

    ' You may use this feature to set reference to these objects
    Dim mySh  As Worksheet
    Dim myWbk As Workbook
    Dim myApp As Application

    Set mySh = myRng.Parent
    Set myWbk = myRng.Parent.Parent
    Set myApp = myRng.Parent.Parent.Parent
    Debug.Print mySh.name, mySh.Cells(10, 1).Value
    Debug.Print myWbk.name, myWbk.Sheets.Count
    Debug.Print myApp.name, myApp.Workbooks.Count

    ' You may use dynamically addressing
    With myRng
        .Copy

        ' Pastes in D1 on sheet 2 in the same workbook, where the copied cell is
        .Parent.Parent.Sheets(2).Range("D1").PasteSpecial xlValues

        ' Or myWbk.Sheets(2).Range("D1").PasteSpecial xlValues

        ' We may dynamically call active application too
        .Parent.Parent.Parent.CutCopyMode = False

        ' Or myApp.CutCopyMode = False
    End With
End Sub

언급URL : https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba

반응형