Vba 存储单元格值但排除空单元格:

Vba 存储单元格值但排除空单元格:,vba,excel,Vba,Excel,我正在编写一个代码,搜索B列中的名称更改,然后在名称更改为新名称(单元格中的新值)时,根据E:J列中的变量数据插入一行和公式。有些名字不止一次,但连续地列在B列中,我想把它归为每人一个总数,但目前它在B列中每次有数据时都做一个总数,而不仅仅是每次名字改变时。我遇到的另一个问题是,它没有计算最后一个人的总数,因为在姓氏之后的B列中只有空单元格,所以不会更改任何内容来激活“THEN”。我非常感谢对我的代码的任何反馈。以下是我目前拥有的: Dim firstrow As Integer ' Star

我正在编写一个代码,搜索B列中的名称更改,然后在名称更改为新名称(单元格中的新值)时,根据E:J列中的变量数据插入一行和公式。有些名字不止一次,但连续地列在B列中,我想把它归为每人一个总数,但目前它在B列中每次有数据时都做一个总数,而不仅仅是每次名字改变时。我遇到的另一个问题是,它没有计算最后一个人的总数,因为在姓氏之后的B列中只有空单元格,所以不会更改任何内容来激活“THEN”。我非常感谢对我的代码的任何反馈。以下是我目前拥有的:

Dim firstrow As Integer
'  Start on row 7 to avoid including header
row = 7
firstrow = 1
previous = Range("B7").value
While row < 1000
'      Move to next row
    row = row + 1
    current = Range("B" & row).value
    If current <> "" And current <> previous Then
    Rows(row).Insert shift:=xlDown
'          Formulas for Columns G, I, J, and K
        Range("G" & row).Formula = "=SUM(E" & firstrow + 2 & ":G" & row - 1 & ")"
        Range("I" & row).Formula = "=sum(H" & firstrow + 2 & ":I" & row - 1 & ")"
        Range("J" & row).Formula = WS.Range("G" & row) - WS.Range("I" & row)
        Range("K" & row).Formula = WS.Range("J" & row) / WS.Range("G" & row)

        row = row
        firstrow = row
    End If
    previous = current
Wend
Dim第一行为整数
'从第7行开始,以避免包含标题
行=7
第一行=1
先前=范围(“B7”).值
而行<1000
'移到下一行
行=行+1
当前=范围(“B”和行)。值
如果当前“”和当前上一个,则
行(行)。插入移位:=xlDown
'列G、I、J和K的公式
范围(“G”和行)。公式=“=SUM(E”和第一行+2&“:G”和行-1&”)
范围(“I”和行)。公式=“=sum(H)”和第一行+2&“:I”和行-1&”
范围(“J”和行)。公式=WS.Range(“G”和行)-WS.Range(“I”和行)
范围(“K”和行)。公式=WS.Range(“J”和行)/WS.Range(“G”和行)
行=行
第一行=第二行
如果结束
先前=当前
温德

<代码> > p>您可以考虑不同的方法:

  • 按从最后一行到第一行的相反顺序循环

  • 使用
    Range
    对象的
    AutoFilter()
    Specialcells()
    方法隔离要写入公式的连续非空单元格块

具体如下:

Option Explicit

Sub main()
    Dim iRow As Long
    Dim area As Range

    With Range("B1", Cells(Rows.Count, 2).End(xlUp))
        For iRow = .Rows.Count To 2 Step -1
            If .Cells(iRow, 1) <> .Cells(iRow + 1, 1) Then .Rows(iRow + 1).EntireRow.Insert shift:=xlDown
        Next
        .AutoFilter Field:=1, Criteria1:="<>"
        If Application.WorksheetFunction.Subtotal(103, .Cells) > 0 Then
            Set area = .SpecialCells(xlCellTypeVisible)
            .Parent.AutoFilterMode = False
            For Each area In area.Areas
                With area.Offset(area.Rows.Count).Resize(1)
                    .Offset(, 5).Formula = "=SUM(" & Intersect(Range("E:G"), area.EntireRow).Address & ")"
                    .Offset(, 7).Formula = "=SUM(" & Intersect(Range("H:I"), area.EntireRow).Address & ")"
                    .Offset(, 8).FormulaR1C1 = "=RC7-RC9"
                    .Offset(, 9).FormulaR1C1 = "=RC10/RC7"
                End With
            Next
        End If
    End With
End Sub
选项显式
副标题()
暗淡无光
模糊区域作为范围
带范围(“B1”,单元格(行数,2)。结束(xlUp))
对于iRow=.Rows.Count到2步骤-1
如果.Cells(iRow,1).Cells(iRow+1,1)那么.Rows(iRow+1).EntireRow.Insert shift:=xlDown
下一个
.自动筛选字段:=1,标准1:=“”
如果Application.WorksheetFunction.Subtotal(103,.Cells)>0,则
设置区域=.SpecialCells(xlCellTypeVisible)
.Parent.AutoFilterMode=False
区域中的每个区域。区域
使用area.Offset(area.Rows.Count)。调整大小(1)
.Offset(,5).Formula=“=SUM(“&Intersect(范围)(“E:G”)、area.EntireRow.Address&”)
.Offset(,7).Formula=“=SUM(“&Intersect(范围(“H:I”)),area.EntireRow.Address&”)
.Offset(,8).公式1c1=“=RC7-RC9”
.Offset(,9).公式1c1=“=RC10/RC7”
以
下一个
如果结束
以
端接头