Gev*_*den 5 excel vba excel-vba
我仅在Excel中使用宏大约4个月了,本质上是通过查找现有代码并弄清楚其工作原理来自学。我现在有点卡住了。
我在Excel工作簿中有一份报告。我需要根据D列中显示的数据跨多个工作表(在同一工作簿中)复制数据。也就是说,我需要复制D列符合特定条件的整行。原始工作表包含公式,但是我只希望在复制数据时出现这些值。
我已经能够复制数据了,但是我有两个问题:1)公式正在复制,而不仅仅是值复制2)数据出现在新工作表的单元格A2中,但是我需要它从单元格A5开始
我将其设置为模板,因为需要每月运行和拆分主要报告,所以我要复制的范围将不是恒定的。这是我当前使用的代码示例:
Sub RefreshSheets()
Sheets("ORIGIN").Select
Dim lr As Long, lr2 As Long, r As Long
lr = Sheets("ORIGIN").Cells(Rows.Count, "A").End(xlUp).Row
lr2 = Sheets("DESTINATION").Cells(Rows.Count, "A").End(xlUp).Row
For r = lr To 2 Step -1
If Range("D" & r).Value = "movedata" Then
Rows(r).Copy Destination:=Sheets("DESTINATION").Range("A" & lr2 + 1)
lr2 = Sheets("DESTINATION").Cells(Rows.Count, "A").End(xlUp).Row
End If
Next r
End Sub
Run Code Online (Sandbox Code Playgroud)
我试过在“ .Range(” A“&lr2 + 1)”之后添加“ .PasteSpecial Paste:= xlPasteValues”,但出现编译错误(预期:语句结尾)。我确信我已经错过了一些显而易见的东西(这是我使用尚不完全了解的代码所得到的),但是到目前为止我没有尝试过。
任何建议将不胜感激。
第一个版本使用 For 循环(行数较多时可能会很慢)
Option Explicit
Public Sub RefreshSheets()
Dim wsO As Worksheet, wsD As Worksheet, lrO As Long, lrD As Long, r As Long
Set wsO = ThisWorkbook.Sheets("ORIGIN")
Set wsD = ThisWorkbook.Sheets("DESTINATION")
lrO = wsO.Cells(Rows.Count, "A").End(xlUp).Row
lrD = wsD.Cells(Rows.Count, "A").End(xlUp).Row
If lrD < 5 Then lrD = 5
For r = lrO To 2 Step -1
If wsO.Range("D" & r).Value2 = "movedata" Then
wsO.Rows(r).Copy
wsD.Range("A" & lrD + 1).PasteSpecial xlPasteValues
lrD = lrD + 1
End If
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
此版本使用自动筛选器一次复制带有“movedata”的所有行:
Public Sub RefreshSheetsFast()
Dim wsO As Worksheet, wsD As Worksheet, lrD As Long
Set wsO = ThisWorkbook.Sheets("ORIGIN")
Set wsD = ThisWorkbook.Sheets("DESTINATION")
lrD = wsD.Cells(Rows.Count, "A").End(xlUp).Row
If lrD < 5 Then lrD = 5 'Makes sure the first row on DESTINATION sheet is >=5
If Not wsO.AutoFilter Is Nothing Then wsO.UsedRange.AutoFilter
With wsO.UsedRange
.Columns(4).AutoFilter Field:=1, Criteria1:="movedata"
.Offset(1).Resize(.Rows.Count - 1).Copy 'Excludes the header (row 1)
End With
wsD.Range("A" & lrD + 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
wsO.UsedRange.AutoFilter 'Removes the "movedata" filter
End Sub
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |