如何在宏结束之前为下一个空单元格指定值而不覆盖它?

时间:2017-08-06 21:34:52

标签: excel-vba loops if-statement checkbox vba

我对编码和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

我最初认为在这里使用循环会有所帮助,但由于我希望该值也存储在工作表数据表中,因此我很难执行该循环。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

问题是因为您在开始时计算hRow一次并且您继续编写同一行:

wsFM.Cells(hRow, 3).End(xlUp).Offset(1, 0)

要解决此问题,每次向工作表“失败模式”写入内容时,都需要增加hRow。也就是说,在每个成功的IfElse语句之前。这是第一个,为所有情况都这样做。

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

这将解决您当前的问题,除此之外,我认为您应该考虑一些简化代码的方法。