Excel VBA에서 Select를 사용하지 않는 방법
저는 이 제품을 사용하는 것에 대해 이해할 수 있는 혐오감에 대해 많이 들어왔습니다..Select
Excel 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) 관련 사물을 직접 작업한다.
이 코드를 고려합니다.
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
( 되었을 때 ( 추가) (링크 추가) ( 추가)
- 사용자가 워크시트를 볼 수 있도록 사용자에게 워크시트를 표시하는 경우.
- Working 매크로와 같은 시나리오에서는 강제로 사용해야 하는 폼 제어에서 실행되면 오류가 반환됩니다.
.Activate
- 통상적인 방법
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
★★★★★★★★★★★★★★★★★」Activate
VBA를 사용합니다.으로는, 「 」입니다.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
또 다른 좋은 예는 이 예에서 설명한 것처럼 모든 시트를 하나의 PDF 파일로 내보내야 하는 경우입니다.이 예에서는 VBA에서 select/active 문을 피하는 방법?
가 " "만
ActiveWindow
Active Window처럼요.줌 또는 Active Window.프리즈 페인
다음에서는 선택 접근법(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.ActiveCell
J4 입니다.
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
'programing' 카테고리의 다른 글
각도별 편집 가능한 데이터 그리드JS (0) | 2023.03.22 |
---|---|
ATOM Editor에서 ESLint for React를 설정하는 방법 (0) | 2023.03.22 |
Nodejs에서 큰 JSON 파일 구문 분석 (0) | 2023.03.22 |
브라우저가 AJAX 요청을 캐싱하지 않음 (0) | 2023.03.22 |
Azure Wordpress 및 Scalable Wordpress (0) | 2023.03.22 |