我有不断增长的数据文件并且在某个列中没有填写。我有填充数据的代码,但是我想创建一个按钮来调用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。
答案 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
我还建议您不要使用range
,value
作为变量,因为其中一些保留关键字。这可能会导致输出行为不正常。
答案 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关键字命名变量