簡體   English   中英

Excel-VBA:在userform調用中輸入范圍

[英]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

我還建議你不要使用rangevalue作為變量,因為其中一些保留關鍵字。 它可能會導致輸出錯誤。

您可以使用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關鍵字命名變量

  • Dim range As Range - 范圍是Excel中最重要的對象
  • Dim value As String - Value是Range對象最重要的屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM