VBA Userform as Inputbox

ⅰ亾dé卋堺 提交于 2019-12-02 06:03:34

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!