【问题标题】:VBA Userform as InputboxVBA 用户窗体作为输入框
【发布时间】:2018-12-17 02:48:27
【问题描述】:

我有一个用户表单,您可以在其上编辑 Excel 工作表单元格中的文本。由于输入框没有跳过按钮,我制作了一个用户表单,您可以在其中搜索整个工作簿中的值并将其替换为另一个值条目。问题是我想一个接一个地编辑找到的值,而不是同时编辑所有值。我有以下代码,但它的作用是,它替换了每张工作表中第一次出现的找到值。我如何更改它替换第一张表中的值然后从第二张表中替换值的逻辑,依此类推。

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

我创建了它,但现在有一个问题,即使没有现有值,它也会跳过。

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

【问题讨论】:

    标签: vba excel for-loop worksheet


    【解决方案1】:

    试试这个

    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
    

    【讨论】:

    • 刚刚测试过。不幸的是,它仍然会立即更改每张纸上第一个找到的值。
    • 对不起.. 看了更好,可以提供以下内容。我已经修改了我原来的帖子。
    • 感谢您的努力。如果你不明白我是德国人,我很抱歉。我测试了第二个版本,但它一次更改了所有找到的值。我的意思是更改第一个找到的值,然后更改下一个值,依此类推,如果没有值,请跳转到下一张表并更改值(如果单击“确定按钮”)。
    • 实际上,我的原始代码一次遍历每张纸的每个单元格,并在必要时更改值。我了解您希望让用户有可能接受或不接受价值的变化。请看一下修改后的代码。
    • 不错!但是,如果您在 msgBox 上单击“否”,它会保留在同一张纸上,但效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多