我对编码和vba相当新,我很难尝试将值分配给下一个空单元而不会在宏结束前覆盖第一个值。
我有一个带有48个复选框的用户表单(标有复选框49-106)。根据用户选择的复选框,我希望与该复选框关联的值打印在工作表故障模式的列中。代码将值打印到正确的列,但如果勾选了多个复选框,则最后一个复选框的值是唯一显示的值。
Dim wsDataTable As Worksheet
Dim wsFM As Worksheet
Dim text1 As String
text1 = TextBox1.Value
Set wsDataTable = Worksheets("Data Table")
Set wsFM = Worksheets("Failure Modes")
iRow = wsDataTable.Cells.Find(What:=text1, SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues).Row
hRow = Worksheets("Failure Modes").Cells(Rows.Count, 1).End(xlUp).Row
If CheckBox49.Value = True Then
wsDataTable.Cells(iRow, 59).Value = "A1 "
wsFM.Cells(hRow, 3).End(xlUp).Offset(1, 0) = "A1 "
Else
wsDataTable.Cells(iRow, 59).Value = ""
End If
If CheckBox50.Value = True Then
wsDataTable.Cells(iRow, 60).Value = "B1 "
wsFM.Cells(hRow, 3).End(xlUp).Offset(1, 0) = "B1 "
Else
wsDataTable.Cells(iRow, 60).Value = ""
End If
If CheckBox51.Value = True Then
wsDataTable.Cells(iRow, 61).Value = "C1 "
wsFM.Cells(hRow, 3).End(xlUp).Offset(1, 0) = "C1 "
Else
wsDataTable.Cells(iRow, 61).Value = ""
End If
If CheckBox52.Value = True Then
wsDataTable.Cells(iRow, 62).Value = "D1 "
wsFM.Cells(hRow, 3).End(xlUp).Offset(1, 0) = "D1 "
Else
wsDataTable.Cells(iRow, 62).Value = ""
End If
如果选中复选框49,工作表故障模式中的第3列将显示:
A1
如果选中复选框49,50,51,52,工作表故障模式中的第3列将显示:
D1
我想如果选中复选框49,50,51,52,工作表故障模式中的第3列将显示:
A1
B1
C1
D1
我最初认为在这里使用循环会有所帮助,但由于我希望该值也存储在工作表数据表中,因此我很难执行该循环。
任何帮助将不胜感激!
答案 0 :(得分:1)
问题是因为您在开始时计算hRow
一次并且您继续编写同一行:
wsFM.Cells(hRow, 3).End(xlUp).Offset(1, 0)
要解决此问题,每次向工作表“失败模式”写入内容时,都需要增加hRow
。也就是说,在每个成功的If
和Else
语句之前。这是第一个,为所有情况都这样做。
If CheckBox49.Value = True Then
wsDataTable.Cells(iRow, 59).Value = "A1 "
wsFM.Cells(hRow, 3).End(xlUp).Offset(1, 0) = "A1 "
hRow = hRow + 1 ' <------------------------ Add this after each writing to wsFM
Else
wsDataTable.Cells(iRow, 59).Value = ""
End If
这将解决您当前的问题,除此之外,我认为您应该考虑一些简化代码的方法。