从 A19 行开始而不是 A1 行

Start at Row A19 instead of Row A1

我正在尝试创建一个输入数据用户窗体,其中输入从“A19”开始,一旦空行被 1 1 填充,将在“A30”行结束,而不是从“开始”的当前情况A1”并且不受限制。

Private Sub cmdAdd_Click()
Dim wks As Worksheet
Dim AddNew As Range
Set wks = ActiveSheet

Set AddNew = wks.Range("A2:A65565").End(xlUp).Offset(1, 0)

AddNew.Offset(0, 2).Value = txtCAC.Text
AddNew.Offset(0, 4).Value = txtName.Text
AddNew.Offset(0, 5).Value = txtType.Text
AddNew.Offset(0, 6).Value = txtClass.Text
AddNew.Offset(0, 7).Value = txtDate.Text
AddNew.Offset(0, 8).Value = txtParent.Text
AddNew.Offset(0, 9).Value = txtManagement.Text
AddNew.Offset(0, 10).Value = txtSuccess.Text
AddNew.Offset(0, 12).Value = txtPercentage.Text
AddNew.Offset(0, 21).Value = txtCommittment.Text
AddNew.Offset(0, 38).Value = txtContribution.Text
AddNew.Offset(0, 40).Value = txtRedemption.Text

lstDisplay.ColumnCount = 41
lstDisplay.RowSource = "A2:A65356"

End Sub
Dim wks As Worksheet
Dim AddNew As Range
Set wks = ActiveSheet
Dim h As Integer

h = wks.Range("C65356").End(xlUp).Row

If h < 18 Then h = 18
if h > 30 then exit Sub

Set AddNew = wks.Range("A" & h)

AddNew.Offset(1, 2).Value = txtCAC.Text
AddNew.Offset(1, 4).Value = txtName.Text
AddNew.Offset(1, 5).Value = txtType.Text
AddNew.Offset(1, 6).Value = txtClass.Text
AddNew.Offset(1, 7).Value = txtDate.Text
AddNew.Offset(1, 8).Value = txtParent.Text
AddNew.Offset(1, 9).Value = txtManagement.Text
AddNew.Offset(1, 10).Value = txtSuccess.Text
AddNew.Offset(1, 12).Value = txtPercentage.Text
AddNew.Offset(1, 21).Value = txtCommittment.Text
AddNew.Offset(1, 38).Value = txtContribution.Text
AddNew.Offset(1, 40).Value = txtRedemption.Text

'lstDisplay.ColumnCount = 41
'lstDisplay.RowSource = "A2:A65356"

显然你的目标是覆盖相邻的固定目标范围 对于一组完整的文本框条目,我建议执行以下步骤:

  • [0.] 在目标单元格中​​定义固定起始单元格,例如通过 set tgt = Sheet1.Range("A19").
  • [1. a)] Split 所需文本框名称的列表,从而获得一维数组,顺便说一句,它将自动从 0 开始。
  • [1. b)] 由一个二维数据数组提供数据并使其成为zero-based,也是为了 在以下循环中同步两个数组计数器 (1.c).
  • [1. c)] 通过 For..Next 循环用所有文本框内容填充数据数组行 并检查不允许的 zero-length 输入; 如果有任何显示警告消息并将焦点重定向到空文本框。
  • [2.] 最终将数据数组转储到选定的目标范围 通过使用列出的文本框控件的数量 cnt.Resize 目标范围(例如 OP 中的 12)。
Private Sub cmdAdd_Click()

'0. Define fixed start cell in target range
    dim tgt as Range
    set tgt = Sheet1.Range("A19")                ' change to any wanted sheet Code(Name)
'1. a) split a list of needed textbox names getting a 1-dim 0-based array automatically
    Dim myTextboxes As Variant
    myTextboxes = Split( _
        "txtCAC,txtName,txtType,txtClass,txtDate,txtParent,txtManagement," & _
        "txtSuccess,txtPercentage,txtCommittment,txtContribution,TxtRedemption", _
        ",")
    Dim cnt As Long
    cnt = UBound(myTextboxes) + 1                ' count number of textboxes

'   b) provide for data by a 2-dim data array (make it zero-based, too)
    Dim data As Variant
    ReDim data(0 To cnt - 1, 0 To 0)             ' define dimensions holding data

'   c) fill data array rows with all textbox contents
    Dim i As Long, ctrl As MSForms.Control
    For i = LBound(data) To UBound(data)         ' i.e. 0 To 11
        Set ctrl = Me.Controls(myTextboxes(i))   ' set control to memory
        data(i, 0) = ctrl.Text                   ' get textbox content
        
    ' check for complete entries or exit sub
        If Len(Trim(data(i, 0))) = 0 Then        ' check for zero-length input
            MsgBox "Fill in empty Textbox(es) first!", vbExclamation, ctrl.Name
            ctrl.SetFocus                        ' set focus to empty box
            Exit Sub                             ' escape procedure
        End If
    Next

'2. dump data to target range               
    tgt.Resize(cnt, 1) = data             ' write data

End Sub

进一步提示

我认为需要定义一个 RowSource(顺便说一句,如果您要通过命令按钮覆盖所有数据,最好使用 "Sheet1!A19:A30"

旁注:更喜欢通过例如获取最后一行单元格Sheet1.Range("A" & .Rows.Count).End(xlUp) 或通过 .Range("A" & .Rows.Count).End(xlUp).Row 的行索引,而不是编码固定的行数(当前工作表大约有 100 万)。您可能有兴趣阅读 Finding last used cell `