Excel VBA에서 변경된 셀의 이전 값을 얻으려면 어떻게 해야 합니까?
이렇게 Excel 스프레드시트에서 특정 셀 값의 변화를 감지하고 있습니다.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Dim old_value As String
Dim new_value As String
For Each cell In Target
If Not (Intersect(cell, Range("cell_of_interest")) Is Nothing) Then
new_value = cell.Value
old_value = ' what here?
Call DoFoo (old_value, new_value)
End If
Next cell
End Sub
이것을 코드화하는 방법이 나쁘지 않다고 가정하면, 변경 전에 셀 값을 어떻게 얻을 수 있을까요?
이거 먹어봐
변수 발언권을 선언하다
Dim oval
,에는SelectionChange
Public Sub Worksheet_SelectionChange(ByVal Target As Range)
oval = Target.Value
End Sub
당신의 리 your your your your your your andWorksheet_Change
old_value = oval
셀 변경 이벤트를 사용하여 다음 작업을 수행하는 매크로를 실행할 수 있습니다.
vNew = Range("cellChanged").value
Application.EnableEvents = False
Application.Undo
vOld = Range("cellChanged").value
Range("cellChanged").value = vNew
Application.EnableEvents = True
나도 해야만 했어.Chris R의 솔루션은 매우 좋았습니다만, 레퍼런스를 추가하지 않는 것이 호환성이 있다고 생각했습니다.크리스, 콜렉션 사용에 대해 얘기했었죠?Collection을 사용한 다른 솔루션이 있습니다.내 경우엔 그렇게 느리진 않아또한 이 솔루션에서는 이벤트 "_Selection Change"를 추가할 때 항상 작동합니다(workbook_open 불필요).
Dim OldValues As New Collection
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Copy old values
Set OldValues = Nothing
Dim c As Range
For Each c In Target
OldValues.Add c.Value, c.Address
Next c
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
On Local Error Resume Next ' To avoid error if the old value of the cell address you're looking for has not been copied
Dim c As Range
For Each c In Target
Debug.Print "New value of " & c.Address & " is " & c.Value & "; old value was " & OldValues(c.Address)
Next c
'Copy old values (in case you made any changes in previous lines of code)
Set OldValues = Nothing
For Each c In Target
OldValues.Add c.Value, c.Address
Next c
End Sub
당신에게 다른 해결책이 있어요.숨겨진 워크시트를 생성하여 관심 범위의 이전 값을 유지할 수 있습니다.
Private Sub Workbook_Open()
Dim hiddenSheet As Worksheet
Set hiddenSheet = Me.Worksheets.Add
hiddenSheet.Visible = xlSheetVeryHidden
hiddenSheet.Name = "HiddenSheet"
'Change Sheet1 to whatever sheet you're working with
Sheet1.UsedRange.Copy ThisWorkbook.Worksheets("HiddenSheet").Range(Sheet1.UsedRange.Address)
End Sub
워크북이 닫히면 삭제...
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
Me.Worksheets("HiddenSheet").Delete
Application.DisplayAlerts = True
End Sub
또한 워크시트_이벤트를 다음과 같이 변경합니다.
For Each cell In Target
If Not (Intersect(cell, Range("cell_of_interest")) Is Nothing) Then
new_value = cell.Value
' here's your "old" value...
old_value = ThisWorkbook.Worksheets("HiddenSheet").Range(cell.Address).Value
Call DoFoo(old_value, new_value)
End If
Next cell
' Update your "old" values...
ThisWorkbook.Worksheets("HiddenSheet").UsedRange.Clear
Me.UsedRange.Copy ThisWorkbook.Worksheets("HiddenSheet").Range(Me.UsedRange.Address)
제가 과거에 사용했던 방법이 있어요.Microsoft Scripting Runtime에 대한 참조를 추가해야 사전 개체를 사용할 수 있습니다. 이 참조를 추가하지 않으려면 Collections를 사용할 수 있지만 속도가 느리고 확인할 수 있는 우아한 방법이 없습니다.존재합니다(오류를 트랩해야 합니다).
Dim OldVals As New Dictionary
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
For Each cell In Target
If OldVals.Exists(cell.Address) Then
Debug.Print "New value of " & cell.Address & " is " & cell.Value & "; old value was " & OldVals(cell.Address)
Else
Debug.Print "No old value for " + cell.Address
End If
OldVals(cell.Address) = cell.Value
Next
End Sub
다른 유사한 방법과 마찬가지로 이 방법에도 문제가 있습니다. 우선, 값이 실제로 변경될 때까지 "오래된" 값을 알 수 없습니다.이 문제를 해결하려면 워크북의 열기 이벤트를 캡처하고 시트를 통과해야 합니다.OldVal을 채우는 UsedRange.또한 디버거 등을 중지하여 VBA 프로젝트를 리셋하면 데이터가 모두 손실됩니다.
아이디어...
- write the the write
ThisWorkbook표시 - 워크북을 닫고 엽니다.
퍼블릭 라스트 셀의 범위 개인 서브워크북_오픈() LastCell = ActiveCell 설정 종료 서브 개인 하위 워크북_Sheet Selection Change(ByVal Sh As Object, ByVal Target As Range) oa = LastCell을 설정합니다.댓글 만약 oa가 아무것도 아닌 경우라스트 셀댓글.삭제종료 조건 목표물Add Comment Target(추가 코멘트 대상).주소.목표물댓글.표시됨 = 참LastCell = ActiveCell 설정 종료 서브
워크시트의 코드 모듈에 다음 항목을 입력하여 사용된 범위의 모든 셀에 대한 마지막 값을 추적합니다.
Option Explicit
Private r As Range
Private Const d = "||"
Public Function ValueLast(r As Range)
On Error Resume Next
ValueLast = Split(r.ID, d)(1)
End Function
Private Sub Worksheet_Activate()
For Each r In Me.UsedRange: Record r: Next
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
For Each r In Target: Record r: Next
End Sub
Private Sub Record(r)
r.ID = r.Value & d & Split(r.ID, d)(0)
End Sub
그리고 이것이 마지막입니다.
이 솔루션에서는 불분명하고 거의 사용되지 않는 Range를 사용합니다.ID 속성: 워크북을 저장하고 닫을 때 이전 값을 유지할 수 있습니다.
언제든지 셀의 이전 값을 얻을 수 있으며 실제로 새로운 현재 값과 다릅니다.
With Sheet1
MsgBox .[a1].Value
MsgBox .ValueLast(.[a1])
End With
Matt Roy의 솔루션을 조금 더 자세히 설명했습니다.그건 그렇고, 훌륭합니다.사용자가 전체 행/열을 선택한 상황을 처리하여 매크로가 선택과 " 사이의 교차만 기록합니다.Used Range" 및 선택 범위가 아닌 상황(버튼, 도형, 피벗 테이블의 경우)도 처리했습니다.
Sub trackChanges_loadOldValues_toCollection(ByVal Target As Range)
'LOADS SELECTION AND VALUES INTO THE COLLECTION collOldValues
If isErrorHandlingOff = False Then: On Error GoTo endWithError
Dim RngI As Range, newTarget As Range, arrValues, arrFormulas, arrAddress
'DON'T RECORD WHEN SELECTING BUTTONS OR SHAPES, ONLY FOR RANGES
If TypeName(Target) <> "Range" Then: Exit Sub
'RESET OLD VALUES COLLECITON
Set collOldValues = Nothing
'ONLY RECORD CELLS IN USED RANGE, TO AVOID ISSUES WHEN SELECTING WHOLE ROW
Set newTarget = Intersect(Target, Target.Parent.UsedRange)
'newTarget.Select
If Not newTarget Is Nothing Then
For Each RngI In newTarget
'ADD TO COLLECTION
'ITEM, KEY
collOldValues.add Array(RngI.value, RngI.formula), RngI.Address
Next RngI
End If
done:
Exit Sub
endWithError:
DisplayError Err, "trackChanges_loadOldValues_toCollection", Erl
End Sub
이것을 시험해 보세요.첫 번째 선택에서는 동작하지 않습니다.그러면 잘 동작합니다:)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo 10
If Target.Count > 1 Then GoTo 10
Target.Value = lastcel(Target.Value)
10
End Sub
Function lastcel(lC_vAl As String) As String
Static vlu
lastcel = vlu
vlu = lC_vAl
End Function
오래된 값을 캡처하여 복잡한 스케줄 스프레드시트에 입력된 새로운 값과 비교해야 했습니다.사용자가 여러 행을 동시에 변경해도 작동하는 일반적인 솔루션이 필요했습니다.솔루션은 해당 클래스의 CLASS 및 COLLECTION을 구현했습니다.
클래스: old Value
Private pVal As Variant
Private pAdr As String
Public Property Get Adr() As String
Adr = pAdr
End Property
Public Property Let Adr(Value As String)
pAdr = Value
End Property
Public Property Get Val() As Variant
Val = pVal
End Property
Public Property Let Val(Value As Variant)
pVal = Value
End Property
셀을 추적하는 세 장의 시트가 있습니다.각 시트는 다음과 같이 자체 컬렉션을 ProjectPlan 모듈의 글로벌 변수로 가져옵니다.
Public prepColl As Collection
Public preColl As Collection
Public postColl As Collection
Public migrColl As Collection
InitDictionaries SUB는 컬렉션을 확립하기 위해 worksheet.open에서 호출됩니다.
Sub InitDictionaries()
Set prepColl = New Collection
Set preColl = New Collection
Set postColl = New Collection
Set migrColl = New Collection
End Sub
oldValue 객체의 각 컬렉션을 관리하는 데 사용되는 모듈은 Add, Exists 및 Value입니다.
Public Sub Add(ByRef rColl As Collection, ByVal sAdr As String, ByVal sVal As Variant)
Dim oval As oldValue
Set oval = New oldValue
oval.Adr = sAdr
oval.Val = sVal
rColl.Add oval, sAdr
End Sub
Public Function Exists(ByRef rColl As Collection, ByVal sAdr As String) As Boolean
Dim oReq As oldValue
On Error Resume Next
Set oReq = rColl(sAdr)
On Error GoTo 0
If oReq Is Nothing Then
Exists = False
Else
Exists = True
End If
End Function
Public Function Value(ByRef rColl As Collection, ByVal sAdr) As Variant
Dim oReq As oldValue
If Exists(rColl, sAdr) Then
Set oReq = rColl(sAdr)
Value = oReq.Val
Else
Value = ""
End If
End Function
무거운 리프팅은 워크시트_SelectionChange 콜백에서 수행합니다.4개 중 하나를 다음에 나타냅니다.유일한 차이는 ADD 콜과 EXIST 콜에서 사용되는 컬렉션입니다.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim mode As Range
Set mode = Worksheets("schedule").Range("PlanExecFlag")
If mode.Value = 2 Then
Dim c As Range
For Each c In Target
If Not ProjectPlan.Exists(prepColl, c.Address) Then
Call ProjectPlan.Add(prepColl, c.Address, c.Value)
End If
Next c
End If
End Sub
예를 들어, 워크시트_변경 콜백에서 실행된 코드를 벗어난 콜이 호출됩니다.시트 이름을 기준으로 올바른 컬렉션을 할당해야 합니다.
Dim rColl As Collection
If sheetName = "Preparations" Then
Set rColl = prepColl
ElseIf sheetName = "Pre-Tasks" Then
Set rColl = preColl
ElseIf sheetName = "Migr-Tasks" Then
Set rColl = migrColl
ElseIf sheetName = "post-Tasks" Then
Set rColl = postColl
Else
End If
그러면 현재 값을 원래 값과 비교해서 자유롭게 계산할 수 있습니다.
If Exists(rColl, Cell.Offset(0, 0).Address) Then
tsk_delay = Cell.Offset(0, 0).Value - Value(rColl, Cell.Offset(0, 0).Address)
Else
tsk_delay = 0
End If
마크.
먼저 관심 셀의 값을 검출하고 저장하는 방법에 대해 알아보겠습니다.가정하다Worksheets(1).Range("B1")관심있는 휴대폰입니다.일반 모듈에서는 다음을 사용합니다.
Option Explicit
Public StorageArray(0 to 1) As Variant
' Declare a module-level variable, which will not lose its scope as
' long as the codes are running, thus performing as a storage place.
' This is a one-dimensional array.
' The first element stores the "old value", and
' the second element stores the "new value"
Sub SaveToStorageArray()
' ACTION
StorageArray(0) = StorageArray(1)
' Transfer the previous new value to the "old value"
StorageArray(1) = Worksheets(1).Range("B1").value
' Store the latest new value in Range("B1") to the "new value"
' OUTPUT DEMONSTRATION (Optional)
' Results are presented in the Immediate Window.
Debug.Print "Old value:" & vbTab & StorageArray(0)
Debug.Print "New value:" & vbTab & StorageArray(1) & vbCrLf
End Sub
그런 다음 워크시트(1) 모듈에서 다음을 수행합니다.
Option Explicit
Private HasBeenActivatedBefore as Boolean
' Boolean variables have the default value of False.
' This is a module-level variable, which will not lose its scope as
' long as the codes are running.
Private Sub Worksheet_Activate()
If HasBeenActivatedBefore = False then
' If the Worksheet has not been activated before, initialize the
' StorageArray as follows.
StorageArray(1) = Me.Range("B1")
' When the Worksheets(1) is activated, store the current value
' of Range("B1") to the "new value", before the
' Worksheet_Change event occurs.
HasBeenActivatedBefore = True
' Set this parameter to True, so that the contents
' of this if block won't be evaluated again. Therefore,
' the initialization process above will only be executed
' once.
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("B1")) Is Nothing then
Call SaveToStorageArray
' Only perform the transfer of old and new values when
' the cell of interest is being changed.
End If
End Sub
을 볼 수 .Worksheets(1).Range("B1")에서 해당 인지, 또는 인지 여부Worksheets(1).Range("B1").
를 StorageArray퍼블릭으로서 같은 VBA 프로젝트의 다른 모듈에서 최신 값을 참조할 수 있습니다.
범위를 검출로 확장하고 여러 셀의 값을 저장하려면 다음 작업을 수행해야 합니다.
StorageArray행 수가 모니터링 중인 셀 수와 동일한 2차원 배열로 표시됩니다.- 「 」를합니다.
Sub SaveToStorageArraySub SaveToStorageArray(TargetSingleCell as Range)관련 코드를 변경합니다. - 「 」를합니다.
Private Sub Worksheet_Change이치노
부록: 변수의 라이프 타임에 대한 자세한 내용은http://https://msdn.microsoft.com/en-us/library/office/gg278427.aspx 를 참조해 주세요.
저는 이 기능이 필요했고, 위의 모든 솔루션이 그대로 마음에 들지 않았습니다.
- 느리다
- application.undo를 사용하는 것과 같은 복잡한 의미가 있습니다.
- 선택되지 않은 경우 캡처하지 않음
- 이전에 변경되지 않은 값을 캡처하지 않음
- 너무 복잡하다
음, 나는 그것에 대해 매우 곰곰이 생각했고 완전한 UNDO, REDO 역사를 위한 해결책을 완성했다.
오래된 가치를 포착하는 것은 실제로 매우 쉽고 매우 빠릅니다.
사용자가 시트를 열면 모든 값이 변수로 열리고 변경 후 갱신됩니다.이 변수는 셀의 이전 값을 확인하는 데 사용됩니다.위의 모든 솔루션에서 루프를 위해 사용됩니다.사실 훨씬 쉬운 방법이 있다.
모든 값을 캡처하려면 이 간단한 명령을 사용했습니다.
SheetStore = sh.UsedRange.Formula
네, 그뿐입니다.범위가 여러 셀일 경우 실제로 Excel은 어레이를 반환합니다.따라서 FOR 명령어를 사용할 필요가 없고 매우 빠릅니다.
다음 서브는 워크북에서 호출해야 하는 전체 코드입니다.시트 활성화.변경 내용을 캡처하려면 다른 서브를 생성해야 합니다.예를 들어 워크북에서 실행되는 "catchChanges"라는 서브가 있습니다.시트 변경변경 내용을 캡처하여 다른 변경 내역 시트에 저장합니다.그런 다음 UpdateCache를 실행하여 캐시를 새 값으로 업데이트합니다.
' should be added at the top of the module
Private SheetStore() As Variant
Private SheetStoreName As String ' I use this variable to make sure that the changes I captures are in the same active sheet to prevent overwrite
Sub UpdateCache(sh As Object)
If sh.Name = ActiveSheet.Name Then ' update values only if the changed values are in the activesheet
SheetStoreName = sh.Name
ReDim SheetStore(1 To sh.UsedRange.Rows.count, 1 To sh.UsedRange.Columns.count) ' update the dimension of the array to match used range
SheetStore = sh.UsedRange.Formula
End If
End Sub
이전 값을 얻으려면 어레이의 셀 주소가 같기 때문에 매우 간단합니다.
예를 들어 셀 D12를 원하는 경우 다음을 사용할 수 있습니다.
SheetStore(row_number,column_number)
'example
return = SheetStore(12,4)
' or the following showing how I used it.
set cell = activecell ' the cell that we want to find the old value for
newValue = cell.value ' you can ignore this line, it is just a demonstration
oldValue = SheetStore(cell.Row, cell.Column)
이 부분들은 방법을 설명하는 단편들이에요, 나는 모두가 그것을 좋아했으면 좋겠어요.
Matt Roy의 답변에 대해 저는 이 옵션이 좋은 답변이라고 느꼈습니다.하지만 현재 평가로는 그렇게 게시할 수 없었습니다.:(
다만, 이 기회에, 그의 회신을 투고하는 동안, 저는 이 기회에 작은 수정을 넣으려고 생각했습니다.코드를 비교해 보세요.
이 코드를 알려준 맷 로이와 크리스에게 감사드립니다원래 코드를 게시하기 위한 R.
Dim OldValues As New Collection
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'>> Prevent user from multiple selection before any changes:
If Selection.Cells.Count > 1 Then
MsgBox "Sorry, multiple selections are not allowed.", vbCritical
ActiveCell.Select
Exit Sub
End If
'Copy old values
Set OldValues = Nothing
Dim c As Range
For Each c In Target
OldValues.Add c.Value, c.Address
Next c
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
On Local Error Resume Next ' To avoid error if the old value of the cell address you're looking for has not been copied
Dim c As Range
For Each c In Target
If OldValues(c.Address) <> "" And c.Value <> "" Then 'both Oldvalue and NewValue are Not Empty
Debug.Print "New value of " & c.Address & " is " & c.Value & "; old value was " & OldValues(c.Address)
ElseIf OldValues(c.Address) = "" And c.Value = "" Then 'both Oldvalue and NewValue are Empty
Debug.Print "New value of " & c.Address & " is Empty " & c.Value & "; old value is Empty" & OldValues(c.Address)
ElseIf OldValues(c.Address) <> "" And c.Value = "" Then 'Oldvalue is Empty and NewValue is Not Empty
Debug.Print "New value of " & c.Address & " is Empty" & c.Value & "; old value was " & OldValues(c.Address)
ElseIf OldValues(c.Address) = "" And c.Value <> "" Then 'Oldvalue is Not Empty and NewValue is Empty
Debug.Print "New value of " & c.Address & " is " & c.Value & "; old value is Empty" & OldValues(c.Address)
End If
Next c
'Copy old values (in case you made any changes in previous lines of code)
Set OldValues = Nothing
For Each c In Target
OldValues.Add c.Value, c.Address
Next c
저도 당신과 같은 문제가 있습니다.다행히 이 링크에서 해결책을 읽었습니다.http://access-excel.tips/value-before-worksheet-change/
Dim oldValue As Variant
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target.Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
'do something with oldValue...
End Sub
주의: 다음 위치를 지정해야 합니다.oldValue모든 서브클래스가 사용할 수 있도록 variable을 글로벌 변수로 지정합니다.
Private Sub Worksheet_Change(ByVal Target As Range)
vNEW = Target.Value
aNEW = Target.Address
Application.EnableEvents = False
Application.Undo
vOLD = Target.Value
Target.Value = vNEW
Application.EnableEvents = True
End Sub
사용.Static(초기화할 수 있는 다른 것을 사용하여) 문제를 해결합니다.old_value올바르게:
Private Sub Worksheet_Change(ByVal Target As Range)
Static old_value As String
Dim inited as Boolean 'Used to detect first call and fill old_value
Dim new_value As String
If Not Intersect(cell, Range("cell_of_interest")) Is Nothing Then
new_value = Range("cell_of_interest").Value
If Not inited Then
inited = True
Else
Call DoFoo (old_value, new_value)
End If
old_value = new_value
Next cell
End Sub
워크북 코드에서 강제 호출:Worksheet_change채우다old_value:
Private Sub Private Sub Workbook_Open()
SheetX.Worksheet_Change SheetX.Range("cell_of_interest")
End Sub
단, 코드 실행을 정지(리셋)하면(새로운 매크로 작성, 일부 코드 디버깅 등) VBA 변수를 기반으로 하는 모든 솔루션(사전 및 기타 보다 복잡한 메서드 포함)은 실패합니다.이러한 문제를 방지하려면 다른 저장 방법(예: 숨겨진 워크시트)을 사용하는 것이 좋습니다.
저는 이 오래된 글을 읽었고, 다른 해결책을 제안하고 싶습니다.
응용 프로그램 실행 중 문제.취소는 Woksheet_Change가 다시 실행되는 것입니다.복구 시에도 같은 문제가 발생합니다.
이를 피하기 위해 코드 조각을 사용하여 Worksheet_Change의 두 번째 단계를 회피합니다.
시작하기 전에 Worksheet_Change를 다시 실행하지 않도록 Excel에 지시하기 위해 Boolean 정적 변수 BlnAlreadyBeenHere를 생성해야 합니다.
여기서 확인할 수 있습니다.
Private Sub Worksheet_Change(ByVal Target As Range)
Static blnAlreadyBeenHere As Boolean
'This piece avoid to execute Worksheet_Change again
If blnAlreadyBeenHere Then
blnAlreadyBeenHere = False
Exit Sub
End If
'Now, we will store the old and new value
Dim vOldValue As Variant
Dim vNewValue As Variant
'To store new value
vNewValue = Target.Value
'Undo to retrieve old value
'To avoid new Worksheet_Change execution
blnAlreadyBeenHere = True
Application.Undo
'To store old value
vOldValue = Target.Value
'To rewrite new value
'To avoid new Worksheet_Change execution agein
blnAlreadyBeenHere = True
Target.Value = vNewValue
'Done! I've two vaules stored
Debug.Print vOldValue, vNewValue
End Sub
이 방법의 장점은 워크시트_SelectionChange를 실행할 필요가 없다는 것입니다.
루틴을 다른 모듈에서 동작시키려면 변수 blnAlreadyBeenHere의 선언을 루틴에서 삭제하고 Dim과 함께 선언하면 됩니다.
모듈 헤더에서 vOldValue 및 vNewValue와 동일한 작업
Dim blnAlreadyBeenHere As Boolean
Dim vOldValue As Variant
Dim vNewValue As Variant
그냥 생각일 뿐인데, 어플리케이션을 사용해 본 적이 있나요?
그러면 값이 다시 설정됩니다.그러면 원래 값을 읽을 수 있습니다.새 값을 먼저 저장하는 것은 그리 어렵지 않으므로 원하는 경우 다시 변경할 수 있습니다.
언급URL : https://stackoverflow.com/questions/4668410/how-do-i-get-the-old-value-of-a-changed-cell-in-excel-vba
'programing' 카테고리의 다른 글
| Bash 스크립트에서 특정 상황이 발생했을 때 스크립트 전체를 종료하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
|---|---|
| UITableView - 섹션 헤더 색상 변경 (0) | 2023.04.09 |
| 셸 스크립트에서 하위 문자열 하나를 다른 문자열로 바꿉니다. (0) | 2023.04.09 |
| 배치 스크립트루프 (0) | 2023.04.09 |
| 문자열에 문자가 있는지 테스트합니다. (0) | 2023.04.09 |