问题
I have an userform on which you can edit the text in cells of an excel sheet. Since the inputbox doesn't have a skip button, I made an Userform where you can search a value in the whole workbook and replace it with another value entry. The thing is I want to edit the found values one by the other and not all at the same time. I have the following code but what this does is, it replaces every first occurance of the found value in every sheet. How could I change the logic that it replaces the values from first sheet then from second and so on.
Dim ws As Worksheet
Dim Loc As Range
Dim StrVal As String
Dim StrRep As String
Private Sub CommandButton1_Click()
StrVal = UserForm1.TextBox3.Text
If Trim(StrVal) = "" Then Exit Sub
For Each ws In ThisWorkbook.Worksheets
With ws.UsedRange
Set Loc = .Cells.Find(What:=StrVal)
If Not Loc Is Nothing Then
'Do Until Loc Is Nothing
Application.Goto Loc, False
StrRep = TextBox1.Text
If Not StrRep = "" Then
Loc.Value = StrRep
Set Loc = .FindNext(Loc)
Else
Exit Sub
End If
'Loop
End If
End With
Set Loc = Nothing
Next
End Sub
I created this which works but has now the problem that it skips though even if there is no existing value.
Set ws = ThisWorkbook.ActiveSheet
Set Loc = ws.Cells.Find(what:=StrVal)
If Not Loc Is Nothing Then
Application.Goto Loc, False
StrRep = TextBox1.Text
If Not StrRep = "" Then Loc.Value = StrRep
Else
Worksheets(ActiveSheet.Index + 1).Select
End If
回答1:
Try this
For Each ws In ThisWorkbook.Worksheets
Application.Goto ws.Range("A1"), True
Set Loc = ws.Cells.Find(What:=strVal, After:=ws.Cells(Rows.Count, Columns.Count), SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) 'You can change MatchCase to True for better checking
If Not Loc Is Nothing Then
strFirstAddress = Loc.Address
changeBool = False
Do
strRep = Me.TextBox1.Text
If Not strRep = "" Then
Application.Goto ws.Range(Loc.Address), False
If MsgBox("Do you want to change the value of cell " & Loc.Address(0, 0) & " of worksheet " & ws.Name & "?", vbYesNo + vbQuestion, "Question") = vbYes Then
Loc.Value = strRep
If Loc.Address = strFirstAddress Then
changeBool = True
Else
changeBool = False
End If
Else
changeBool = False
End If
End If
Set Loc = ws.Cells.FindNext(After:=Loc)
If Not Loc Is Nothing Then
If Loc.Address = strFirstAddress Then Set Loc = Nothing
End If
If Not Loc Is Nothing And changeBool = True Then strFirstAddress = Loc.Address
Loop While Not Loc Is Nothing
End If
Next ws
来源:https://stackoverflow.com/questions/51245196/vba-userform-as-inputbox