하나는 문자열로 채워지고 다른 하나는 비어있는 두 개의 열로 구성된 Excel 워크 시트가 있습니다. VBA를 사용하여 다른 열의 인접한 문자열 값을 기준으로 빈 열의 셀 값을 할당하고 싶습니다.
Dim regexAdmin As Object Set regexAdmin = CreateObject("VBScript.RegExp") regexAdmin.IgnoreCase = True regexAdmin.Pattern = "Admin" Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows Dim j As Integer For j = 1 To 2 If regexAdmin.test(Cells(i, j).Value) Then Cells(i, j + 1).Value = "Exploitation" End If Next j Next i
The 문제는 많은 양의 데이터에이 루프를 사용할 때 작업하는 데 시간이 너무 오래 걸리고 대부분의 경우 단순히 Excel이 충돌한다는 것입니다.
이 작업을 수행하는 더 좋은 방법을 아는 사람이 있습니까?
답변
간단한 대답 :
vba , 수식을 사용하세요. 특히 IF
및 SEARCH a의 조합을 사용하세요. >.
=IF(SEARCH($A1,"Admin")>0,"Exploitation","")
하지만 이것은 코드 검토이므로 어쨌든 그렇게합시다.
-
Regex는 느립니다. “대소 문자를 구분하지 않기 위해”만 사용하는 것 같습니다. 따라서
StrComp
와vbTextCompare
옵션을 사용하여 셀 값을 직접 비교할 수 있습니다. ( StrComp에 대한 유용한 기사 ) -
i
및j
는 일반적으로 루프 카운터에 사용되지만row
및col
이 경우 더 의미가 있습니다.
다음은 다음과 같습니다.
Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows Dim col As Integer For col = 1 To 2 If StrComp("Admin",Cells(row, col).Value,vbTextCompare) Then Cells(row, col + 1).Value = "Exploitation" End If Next col Next row
답변
간단한 문자열 비교가 Regex보다 훨씬 빠르다고 생각합니다.
Dim pattern as string pattern = "Admin" Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows Dim j As Integer For j = 1 To 2 If Cells(i, j) = pattern Then Cells(i, j + 1) = "Exploitation" End If Next j Next i
댓글
- 이 코드는 ' 대소 문자를 구분하지 않는 비교를 처리하지 않지만 ' 올 바릅니다. 정규식은 과잉이며이 경우 문자열 비교가 선호됩니다. (코드 검토에 오신 것을 환영합니다!)
답변
런타임 50 % 감소를 제안 할 수 있습니다. /노력?
Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows If StrComp("Admin",Cells(row, 1).Value,vbTextCompare) Then Cells(row, 2).Value = "Exploitation" End If Next row
아무도 OP가 “하나의 열을 확인하고 다음 인접 항목에 쓰기”에 대해 말하는 것을 알아 차리지 못했습니까? 그렇다면 왜 열을 반복합니까? 두 번째 단계는 빈 셀 또는 “Exploitation”이있는 셀만 확인합니다.
Answer
와. 처음 몇 줄을 읽는 것만으로도 궁금했습니다.
- 왜 늦게 바인딩합니까?
- 왜 정규식을 사용합니까?
@ ckuhn203은 이미 그의 답변에서 이름을 언급했지만 다음과 같습니다.
Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows
전환됨 :
Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows
… 더 이상 댓글이 필요하지 않습니다.
VBA를 사용하여 다른 열의 인접한 문자열 값을 기준으로 빈 열의 셀 값을 할당하고 싶습니다.
VBA를 사용하는 것이 [잘못 | ab]이라고 생각합니다. Excel 자체는 다른 셀 “값입니다.
regexAdmin.Pattern = "Admin"
제 생각에는 “정규식을 잘못 사용하고 있습니다. 패턴이 평범한 단어라면, 아마도 바주카포로 모기를 죽이려고 할 것입니다. 여기서 작업합니다.
Answer
Range 개체에 액세스 할 때마다 단일 읽기 / 쓰기 작업으로 수행해야합니다.
for 루프를 입력하기 전에 작업하려는 전체 범위를 읽어야합니다.
data = Range(Cells(1,1), Cells(10,2)).Value
이제 작업 할 수 있습니다. 데이터 포함 :
For i = 1 To 10 "let"s say there is 10 rows Dim j As Integer For j = 1 To 2 If regexAdmin.test(data(i, j)) Then data(i, j + 1) = "Exploitation" End If Next j Next i
마지막으로 데이터를 Excel로 다시 작성합니다.
Range(Cells(1,1), Cells(10,2)).Value = data
답변
B1 :
=if(upper(A1)="ADMIN","Exploitation","")
그런 다음 간단히 입력하세요. 대소 문자를 구분하지 않습니다.
이 자동 채우기는 워크 시트에서 대화식으로 또는 프로그래밍 방식으로 두 가지 방법으로 수행 할 수 있습니다.
대화식으로 : Excel에는 자동 완성 기능이 있습니다. B1을 선택하고 해당 수식을 입력 한 상태에서 셀을 선택하면 오른쪽 아래 모서리에있는 작은 사각형 인 채우기 핸들을 두 번 클릭하면됩니다. Excel은 해당 수식을 다음과 같은 연속 범위의 끝까지 지능적으로 복사합니다. A1-A256에 공백이없는 데이터가있는 경우 B256으로 자동 완성됩니다. 또는 공백이있는 경우 맨 아래로 스크롤하여 B256 (또는 끝이 무엇이든)을 선택하십시오. 그런 다음 Ctrl + Shift + 위쪽 화살표를 사용하여 B1으로 이어지는 범위를 선택하고 Ctrl + D를 눌러 아래로 복사합니다 (d = ditto 생각)
VBA 사용 … 프로그래밍 방식으로 수행해야하는 경우 : 셀이 포함 된 수식을 선택 항목으로 사용 :
Selection.AutoFill Destination:=Range("B1:B19")
몇 가지 멋진 트릭을 수행하기 위해 자동 완성에 사용할 수있는 다른 옵션이 있습니다.수식 대신 리터럴 값을 복사하거나 패턴을 기반으로 계열을 채울 수도 있습니다. 또한 상점이있는 도시 나 물건에서 자주 반복하는 업종과 같이 인식 할 사용자 정의 패턴을 설정할 수도 있습니다.
댓글
- 실제로 Code Review에 오신 것을 환영합니다! OP가 열을 검색 할 필요가 없다는 것을 ' 완전히 놓쳤습니다! ++ 최고의 솔루션입니다.
Answer
다른 모든 답변을 결합하면 다음과 같이 대소 문자를 구분하지 않습니다. Option Explicit
는 vba에서 너무 많은 오류를 방지하므로 원본에서 정규식을 사용하면 행 수를 지정하고 모든 변수를 선언 할 필요가 없습니다.
Option Explicit Sub checkForExploit() Dim row As Integer Dim data() As Variant Dim datarange As Range Set datarange = Range("A1:B10") data = datarange.Value For row = 1 To UBound(data, 1) If LCase(data(row, 1)) = "admin" Then data(row, 2) = "Exploitation" End If Next row datarange.Value = data End Sub