[英]Excel-VBA: Inputting range in userform call
我有不斷增長的數據文件,並且在某個列中沒有填寫。 我有填充數據的代碼,但是我想創建一個按鈕來調用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。
在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
作為變量,因為其中一些保留關鍵字。 它可能會導致輸出錯誤。
您可以使用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
要向用戶詢問范圍,可以使用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關鍵字命名變量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.