我要投稿 | RSS
您当前的位置:首页 > ExcelVBA

3个DO循环实现从第1行至工作表最大行的条件运算

作者:      来源:原创
如下图,左侧为原始表,右侧为要生成的结果区域,要求是,在有小计的对应行,生成对应的明细项,工程量为小计最近一次N列显示工程量的值。

人工费为工程量*K列小值人工费后的值。其他项类似。



分析:
我们可以从第1行开始,逐行进行判断,先判断到工程量后,记录工程量所在的行,便于提取工程量的数值,再继续向下,当判断出小计后,在对应的列位置生成值。

通过以上就可以形成简单的一次循环,如下面代码中的黄色和绿色循环。
 

Sub 工程量小计()
Dim rMax As Integer
rMax = ActiveSheet.UsedRange.Rows.Count  ‘获取使用区域中最大的行号,并赋值给变更rMax
Debug.Print rMax
Cells(6, 18) = "工程量"
Cells(6, 19) = "人工费"
Cells(6, 20) = "材料费"
Cells(6, 21) = "机械费"
Cells(6, 22) = "企业管理费"
Cells(6, 23) = "利润"
Dim r As Integer, n As Integer
r = 1
Do While r < rMax
  Do While Cells(r, 14) <> "工程量"
    r = r + 1
    If r > rMax Then
    Exit Do
    End If
  Loop
  n = r
'  Debug.Print r
  Do While Cells(r, 3) <> "小计"
    r = r + 1
    If r > rMax Then
    Exit Do
    End If
  Loop
'  Debug.Print r
  Cells(r, 18) = Cells(n, 15)
  Cells(r, 19) = Cells(n, 15) * Cells(r, 11)
  Cells(r, 20) = Cells(n, 15) * Cells(r, 12)
  Cells(r, 21) = Cells(n, 15) * Cells(r, 14)
  Cells(r, 22) = Cells(n, 15) * Cells(r, 15)
  Cells(r, 23) = Cells(n, 15) * Cells(r, 16)
  r = r + 1
Loop
Range(Cells(6, 18), Cells(rMax, 23)).Borders.LineStyle = xlContinuous
ThisWorkbook.Save
End Sub

 

当我们需要使用vba获取某个表中使用单元格区域中最大的行数的时候,可以使用以下样式。
ActiveSheet.UsedRange.Rows.Count
活动工作表。使用区域。所有号中。总行数

我们需要对某个区域进行加边框时,可以配合rang和cells来使用,对应属性内容如下:
Range(Cells(6, 18), Cells(rMax, 23)).Borders.LineStyle = xlContinuous
区域(左上角位置cells位置,右下角cells位置)。边框。线样式

我们需要保存工作表时,可以使用:
ThisWorkbook.Save

通过测试,原始数据中如果有500行,进行循环完成的话,需要29秒左右。



参考网上的vba测算时间代码:

Sub 工程量小计()
Dim rMax As Integer
rMax = ActiveSheet.UsedRange.Rows.Count
Debug.Print rMax
'下面代码测算vba运行总时间
Dim dteStart As Date
Dim strTime As String
'中间代码为正常的循环
Cells(6, 18) = "工程量"
Cells(6, 19) = "人工费"
Cells(6, 20) = "材料费"
Cells(6, 21) = "机械费"
Cells(6, 22) = "企业管理费"
Cells(6, 23) = "利润"
Dim r As Integer, n As Integer
r = 1
Do While r < rMax
  Do While Cells(r, 14) <> "工程量"
    r = r + 1
    If r > rMax Then
    Exit Do
    End If
  Loop
  n = r
'  Debug.Print r
  Do While Cells(r, 3) <> "小计"
    r = r + 1
    If r > rMax Then
    Exit Do
    End If
  Loop
'  Debug.Print r
  Cells(r, 18) = Cells(n, 15)
  Cells(r, 19) = Cells(n, 15) * Cells(r, 11)
  Cells(r, 20) = Cells(n, 15) * Cells(r, 12)
  Cells(r, 21) = Cells(n, 15) * Cells(r, 14)
  Cells(r, 22) = Cells(n, 15) * Cells(r, 15)
  Cells(r, 23) = Cells(n, 15) * Cells(r, 16)
  r = r + 1
Loop
Range(Cells(6, 18), Cells(rMax, 23)).Borders.LineStyle = xlContinuous
ThisWorkbook.Save
'中间循环结束,并保存
strTime = Format((Timer - dteStart), "0.00000")
MsgBox "运行过程: " & strTime & "秒"
End Sub
 

对于这个运算效率,感觉并不算太高,实际运行的时候,6000行的文件,执行完成实际在2分钟
来顶一下
返回首页
返回首页
推荐资讯
{SUM函数}:计算单元格区域中所有数值的和
{SUM函数}:计算单元
LEFT函数:从一个文本字符串的第一个字符开始返回指定个数的字符
LEFT函数:从一个文本
MID函数:从文本字符串中指定的起始位置起返回指定长度的字符
MID函数:从文本字符
column函数:返回一引用的列号
column函数:返回一引
扫一扫微信二维码,联系作者:
相关文章
    无相关信息
栏目更新
栏目热门