Excel-VBA:在userform调用中输入范围

时间:2018-04-06 02:27:32

标签: excel vba excel-vba

我有不断增长的数据文件并且在某个列中没有填写。我有填充数据的代码,但是我想创建一个按钮来调用userform以便用户填写范围,以便代码在用户提供的范围内工作(因为数据由用户自己调整)。填充空白单元格的代码是:

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

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

3 个答案:

答案 0 :(得分:1)

在userform中放置一个文本框并将其命名为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作为变量,因为其中一些保留关键字。这可能会导致输出行为不正常。

答案 1 :(得分:1)

您可以使用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

答案 2 :(得分:1)

要向用户询问范围,您可以使用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对象最重要的属性