【问题标题】:Excel-VBA: Inputting range in userform callExcel-VBA:在用户窗体调用中输入范围
【发布时间】:2018-04-07 11:42:43
【问题描述】:

我有越来越多的数据文件,并且在某个列中没有填写。我有填充数据的代码,虽然我想制作一个按钮来调用用户表单供用户填写范围,以便代码在用户提供的范围内工作(因为数据是由用户自己调整的)。填充空白单元格的代码是;

Sub fillblank()
Dim range As Range
Dim cell As Range
Dim value As String
Set range = Sheets("Sheet1").Range("E4:E15")
For Each cell In range
 If Trim(cell.Value) <> "" Then
   value = cell.Value
 Else
   cell.Value = value
 End if
Next cell
End Sub

我希望用户在用户表单中输入范围 (E4:E15)。如果仅依赖范围,如何执行用户表单?感谢 stackoverflow.com。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    在用户窗体中放置一个文本框并将其命名为txtRng。然后将名为MyRng 的变量声明为String。将该文本框值分配给MyRng 变量,并将此变量用作范围的参数,例如...

    Set range = Sheets("Sheet1").Range(MyRng)
    

    所以,完整的代码如下所示

    Sub fillblank()
    Dim range As range
    Dim cell As range
    Dim value As String
    Dim MyRng As String
    
        MyRng = UserForm1.txtRng 'Use your form name here
        Set range = Sheets("Sheet1").range(MyRng)
    
        For Each cell In range
         If Trim(cell.value) <> "" Then
           value = cell.value
         Else
           cell.value = value
         End If
        Next cell
    
    End Sub
    

    我还建议您不要使用rangevalue 作为变量,因为其中一些保留关键字。这可能会导致输出异常。

    【讨论】:

    • 我就是想问一下userform的范围怎么写?它会像 E2:E5 还是 R2C5:R5C5?还是?
    • 只需在文本框中输入E2:E5
    • 当我输入值时它什么也不做
    • 检查文件。 Download Link
    • 打开vba代码窗口(按ALT+F11打开代码窗口)。双击左侧窗格中的用户表单(VBA 项目窗口)。然后双击命令按钮(确定按钮)。您应该会看到按钮单击事件背后的代码。
    【解决方案2】:

    您可以使用InputBox() 方法并让用户选择一个范围:

    Sub fillblank()
        Dim myRange As Range
        Dim cell As Range
        Dim myValue As String
    
        Set myRange = Application.InputBox( prompt:="Select a range", Type:=8) 
        For Each cell In myRange
            If Trim(cell.Value) <> "" Then
                myValue = cell.Value
            Else
                cell.Value = myValue
            End if
        Next
    End Sub
    

    或者您可以将RefEdit 控件添加到您的用户窗体并进行处理

    Sub fillblank()
        Dim cell As range
        Dim myValue As String
        For Each cell In range(Me.RefEdit1.Text)
            If Trim(cell.value) <> "" Then
                myValue = cell.value
            Else
                cell.value = myValue
            End If
        Next cell
    End Sub
    

    在这种情况下,由于用户可能输入了无效的范围,您可能需要添加一个验证函数(在下面的示例中命名为 GetRange

    Sub fillblank()
        Dim myRange As range
        If Not GetRange(Me.RefEdit1.Text, myRange) Then
            MsgBox "Select a valid range "
            Me.RefEdit1.SetFocus
            Exit Sub
        End If
    
        Dim cell As range
        Dim myValue As String
        For Each cell In myRange
            If Trim(cell.value) <> "" Then
                myValue = cell.value
            Else
                cell.value = myValue
            End If
        Next cell
    End Sub
    
    Function GetRange(RefEditText As String, myRange As range) As Boolean
        On Error Resume Next
        Set myRange = range(RefEditText)
        On Error GoTo 0
        GetRange = Not myRange Is Nothing
    End Function
    

    最后,这是一种替代方法(无循环),可以按照您的意愿填充空白单元格:

    Sub fillblank()
        With range(Me.RefEdit1.Text).SpecialCells(xlCellTypeBlanks)
            .FormulaR1C1 = "=R[-1]C"
            .value = .value
        End With
    End Sub
    

    【讨论】:

    • 你是什么意思 refedit?我实际上是 vba 的新手,刚刚在 refedit fn 上收到了你的来信。我已经尝试了代码,它给出了对象定义的错误。
    • RefEdit 控件是您在用户窗体工具箱中找到的控件,您可以在其中拖动控件(如按钮、文本框、列表框等)并将它们拖放到用户窗体画布上。我假设您的按钮在用户表单上
    【解决方案3】:

    要向用户询问范围,您可以使用 InputBox(Type:=8)

    下面的代码将只接受一列

    如果选择一整列 (A:A) 或多列,它将调整为 UsedRange 中的总行数和选择中的第一列


    Option Explicit
    
    Public Sub FillBlanks()
      Dim selectedCol As Range, itm As Range, lr As Long
    
      On Error Resume Next
        Set selectedCol = Application.InputBox(Prompt:="Select column:", Type:=8)
      On Error GoTo 0
    
      If selectedCol Is Nothing Then Exit Sub   'User cancelled selection
    
      With selectedCol
       .Parent.Activate
       lr = .Parent.UsedRange.Rows.Count
       If .Columns.Count > 1 Then Set selectedCol = .Resize(.Rows.Count, 1)
       If .Rows.Count < 2 Or .Rows.Count > lr Then Set selectedCol = .Resize(lr - .Row + 1, 1)
       selectedCol.Select
      End With
    
      For Each itm In selectedCol
        If Len(Trim$(itm)) = 0 And itm.Row > 1 Then itm.Value2 = itm.Offset(-1).Value2
      Next
    End Sub
    

    注意:不建议使用特殊的 VBA 关键字命名变量

    • Dim range As Range - Range 是 Excel 中最重要的对象
    • Dim value As String - Value 是 Range 对象最重要的属性

    【讨论】:

    • 如何在输入框中键入?会是E2:E5吗?还是只是数字 4?
    • 当该框出现时,您可以选择工作表上的范围(用鼠标)
    • 我同意这个说明。这只是给我的。在用户excel中会有所不同。
    • 我进行了更新。让我知道是否有任何问题。也可以直接输入E2:E5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多