如何对动态行数调用Excel宏

  • 本文关键字:调用 Excel 动态 excel vba
  • 更新时间 :
  • 英文 :


我想运行一个宏:在一个单元格中插入另一个单元格的信息,然后运行一个将该工作表转换为PDF的宏。我有一种方法可以使用多个if-then语句,但我想知道是否有更干净、更简单的方法。下面是我的代码。单元格的数量可能会有所不同,因为它是基于另一个宏将信息放入其中的。下面是代码。

Sub sub1()
Dim ws, ws1, ws2 As Worksheet
Dim LastRow As Long
Set ws = Worksheets("sht1")
Set ws1 = Worksheets("sht2")
Set ws2 = Worksheets("sht3")
LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
With ws1
.Cells.ClearContents
End With
With ws
.AutoFilterMode = False
.Range("A1:T" & LastRow).AutoFilter Field:=7, Criteria1:="=" & Date
End With
ws.Columns(1).Copy Destination:=ws1.Columns(1)
With ws
.AutoFilterMode = False
End With
If ws1.Range("A2").Value <> "" Then
ws2.Range("D13").ClearContents
ws2.Range("D13").Value = ws1.Range("A2").Value
Call PDFCreate
Else
End If
If ws1.Range("A3").Value <> "" Then
ws2.Range("D13").ClearContents
ws2.Range("D13").Value = ws1.Range("A3").Value
Call PDFCreate
Else
End If
If ws1.Range("A4").Value <> "" Then
ws2.Range("D13").ClearContents
ws2.Range("D13").Value = ws1.Range("A4").Value
Call PDFCreate
Else
End If
If ws1.Range("A5").Value <> "" Then
ws2.Range("D13").ClearContents
ws2.Range("D13").Value = ws1.Range("A5").Value
Call PDFCreate
Else
End If
If ws1.Range("A6").Value <> "" Then
ws2.Range("D13").ClearContents
ws2.Range("D13").Value = ws1.Range("A6").Value
Call PDFCreate
Else
End If
If ws1.Range("A7").Value <> "" Then
ws2.Range("D13").ClearContents
ws2.Range("D13").Value = ws1.Range("A7").Value
Call PDFCreate
Else
End If
If ws1.Range("A8").Value <> "" Then
ws2.Range("D13").ClearContents
ws2.Range("D13").Value = ws1.Range("A8").Value
Call PDFCreate
Else
End If
If ws1.Range("A9").Value <> "" Then
ws2.Range("D13").ClearContents
ws2.Range("D13").Value = ws1.Range("A9").Value
Call PDFCreate
Else
End If
If ws1.Range("A10").Value <> "" Then
ws2.Range("D13").ClearContents
ws2.Range("D13").Value = ws1.Range("A10").Value
Call PDFCreate
Else
End If
ws2.Range("D13").ClearContents

结束子

@Jay请听从@BigBen的声音建议&做一些在线教程,用循环和其他东西来提高你的VBA技能。谷歌搜索"Excel VBA循环教程"会返回数千个结果。

你说你正在寻找一种"更干净、更简单的方式"。您可以做以下几件事来提高代码的有效性。以下是对当前代码的一些观察和建议。

选项显式。养成将其添加到潜艇顶部的习惯。它强制您声明所有变量。

"Dim ws,ws1,ws2 as Worksheet"只是将ws2声明为Worksheet——前两个声明为Variant。需要是"Dim ws as Worksheet,ws1 as Worksheel,ws2 as Worksheeter"。

在这种情况下,我不认为你真的需要找到最后一行——只有过滤后的数据才会被复制到表2中。

你正走向一个痛苦的世界,把你的第二张表称为"ws1",把第三张表称"ws2"。如果你必须让它们成为变量,而在这种情况下你不必这样做,那么帮自己一个忙,更直观地称它们——表1为ws1,表2为ws2等。或者,你可以简单地称它们为"表1"等。

你并不真的需要一个With…End With块来做一些简单的事情,比如清理一张纸。

如果测试为False,则Else仅在If…End If块中使用。在您的情况下,它的使用没有其他选择,因此False返回将直接跳到下一行代码。

我不知道为什么每次都用表2中的值覆盖数据时都会清除表3中D13的内容。

如果你的另一个子"PDFCreate"只是将你的Sheet3导出为PDF——你可以在这个模块中编写代码。只需复制代码并覆盖Call PDFCreate行。

让我知道你如何使用下面的代码。它假设您的"sht1"实际上是工作簿中的Sheet1(依此类推(。

Option Explicit    
Sub ConvertToPDF()
Dim c As Range
Sheet2.Cells.ClearContents
With Sheet1
.Range("A1").AutoFilter Field:=7, Criteria1:="=" & Date
.Columns(1).Copy Sheet2.Columns(1)
.AutoFilterMode = False
End With

'This is the Loop
For Each c In Sheet2.Range("A2:A10")    
If c.Value <> "" Then
Sheet3.Range("D13").Value = c.Value
Call PDFCreate
End If    
Next c

End Sub

最新更新