使用 VBA 在多行中插入验证列表
Insert validation list in multiple rows using VBA
我正在制作一个电子表格来控制我办公室的财务。我制作了一个 VBA 代码,其中输入了 4 个不同的数据:i) 客户姓名; ii) 合同总价值; iii) 支付合同费用的月数; iv) 第一次付款的日期。
根据付款的月数 (iii),代码插入相同数量的行。在@Paster () 的帮助下,我能够做到这一点。
现在我有一个新问题:在每一行中,我想在第 6 列上有一个验证列表 (yes/no),我可以在其中控制是否付款。当只添加 1 行时我能够做到这一点,但我不知道如何在“If .Cells(iRow, 5) > 1 Then”开始时添加。
我希望它看起来像这样:
Client
Value
Date
Control
John
100
01/01/2020
Yes/No
John
100
02/01/2020
Yes/No
Claire
500
01/05/2020
Yes/No
我还在学习VBA,我就是想不通。
实际代码为:
Private Sub cmdAdd_Click()
Dim iRow As Long
Dim ws As Worksheet
Dim Name As String
Dim counter As Integer
Dim money As Double
Dim Data As Date
Dim i As Integer
Set ws = Worksheets("Projetos")
'find first empty row in database
iRow = ws.Cells.Find(What:="*", SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1
'copy the data to the database
With ws
.Cells(iRow, 2).Value = Me.boxCliente.Value 'Client info
.Cells(iRow, 3) = CCur(boxValor.Value) 'Value
.Cells(iRow, 5).Value = Me.boxParcela.Value '# of payments
.Cells(iRow, 4) = CDate(boxData.Value) 'Date
'add validation list to row
With Cells(iRow, 6).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="Não,Sim"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Cells(iRow, 6).Value = "Não"
'if multiple payments, then
If .Cells(iRow, 5) > 1 Then
Name = .Cells(iRow, 2).Value
counter = .Cells(iRow, 5).Value
money = .Cells(iRow, 3).Value
Data = .Cells(iRow, 4).Value
For i = 0 To counter - 1
.Cells(iRow + i, 2).Value = Name
.Cells(iRow + i, 3).Value = money / counter
.Cells(iRow + i, 4).Value = Format(DateAdd("m", i, Data), "mm/dd/yyyy")
Next i
End If
End With
'clear the data
Me.boxCliente.Value = ""
Me.boxValor.Value = ""
Me.boxParcela.Value = ""
Me.boxData.Value = ""
End Sub
采用与一行相同的验证逻辑,并将其包含在将值复制到每一行的循环中 (For i = 1 to counter - 1
)
For i = 0 To counter - 1
.Cells(iRow + i, 2).Value = Name
.Cells(iRow + i, 3).Value = money / counter
.Cells(iRow + i, 4).Value = Format(DateAdd("m", i, Data), "mm/dd/yyyy")
'add validation list to row
With Cells(iRow, 6).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="Não,Sim"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Cells(iRow, 6).Value = "Não"
Next i
我正在制作一个电子表格来控制我办公室的财务。我制作了一个 VBA 代码,其中输入了 4 个不同的数据:i) 客户姓名; ii) 合同总价值; iii) 支付合同费用的月数; iv) 第一次付款的日期。
根据付款的月数 (iii),代码插入相同数量的行。在@Paster (
现在我有一个新问题:在每一行中,我想在第 6 列上有一个验证列表 (yes/no),我可以在其中控制是否付款。当只添加 1 行时我能够做到这一点,但我不知道如何在“If .Cells(iRow, 5) > 1 Then”开始时添加。
我希望它看起来像这样:
Client | Value | Date | Control |
---|---|---|---|
John | 100 | 01/01/2020 | Yes/No |
John | 100 | 02/01/2020 | Yes/No |
Claire | 500 | 01/05/2020 | Yes/No |
我还在学习VBA,我就是想不通。
实际代码为:
Private Sub cmdAdd_Click()
Dim iRow As Long
Dim ws As Worksheet
Dim Name As String
Dim counter As Integer
Dim money As Double
Dim Data As Date
Dim i As Integer
Set ws = Worksheets("Projetos")
'find first empty row in database
iRow = ws.Cells.Find(What:="*", SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1
'copy the data to the database
With ws
.Cells(iRow, 2).Value = Me.boxCliente.Value 'Client info
.Cells(iRow, 3) = CCur(boxValor.Value) 'Value
.Cells(iRow, 5).Value = Me.boxParcela.Value '# of payments
.Cells(iRow, 4) = CDate(boxData.Value) 'Date
'add validation list to row
With Cells(iRow, 6).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="Não,Sim"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Cells(iRow, 6).Value = "Não"
'if multiple payments, then
If .Cells(iRow, 5) > 1 Then
Name = .Cells(iRow, 2).Value
counter = .Cells(iRow, 5).Value
money = .Cells(iRow, 3).Value
Data = .Cells(iRow, 4).Value
For i = 0 To counter - 1
.Cells(iRow + i, 2).Value = Name
.Cells(iRow + i, 3).Value = money / counter
.Cells(iRow + i, 4).Value = Format(DateAdd("m", i, Data), "mm/dd/yyyy")
Next i
End If
End With
'clear the data
Me.boxCliente.Value = ""
Me.boxValor.Value = ""
Me.boxParcela.Value = ""
Me.boxData.Value = ""
End Sub
采用与一行相同的验证逻辑,并将其包含在将值复制到每一行的循环中 (For i = 1 to counter - 1
)
For i = 0 To counter - 1
.Cells(iRow + i, 2).Value = Name
.Cells(iRow + i, 3).Value = money / counter
.Cells(iRow + i, 4).Value = Format(DateAdd("m", i, Data), "mm/dd/yyyy")
'add validation list to row
With Cells(iRow, 6).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="Não,Sim"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Cells(iRow, 6).Value = "Não"
Next i