excel - 为什么 Excel VBA 例程被另一个例程调用后不起作用?

标签 excel vba

我有一个 Sub,我将其作为另一个 Sub 的一部分进行调用。当它单独运行时,它工作得很好,但是当它从另一个子程序调用时,它就不能完全正常工作。主子保存默认值,然后:

Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False

Call FillInCoding

这是无法正常工作的子程序,我认为此编码可能是复制和粘贴特殊的:

Sub FillInCoding()

'clears the area to be pasted into
Worksheets(1).Range("A11:G98567").ClearContents


Dim JE As Worksheet
Dim Sheet1 As Worksheet
Dim lastRow As Long

Set JE = ThisWorkbook.Worksheets(1)
Set Sheet1 = ThisWorkbook.Worksheets(2)


lastRow = Sheet1.Range("R65536").End(xlUp).Row

'This part is copying the values of the ranges from worksheet #2 into the worksheet #1 destination
 Worksheets(2).Range("AM2:AM" & lastRow).Copy
 Worksheets(1).Range("A11:A" & lastRow).PasteSpecial xlPasteValues
 Worksheets(2).Range("AN2:AN" & lastRow).Copy
 Worksheets(1).Range("B11:B" & lastRow).PasteSpecial xlPasteValues
 Worksheets(2).Range("R2:R" & lastRow).Copy
 Worksheets(1).Range("E11:E" & lastRow).PasteSpecial xlPasteValues
 Worksheets(2).Range("AO2:AO" & lastRow).Copy
 Worksheets(1).Range("G11:G" & lastRow).PasteSpecial xlPasteValues


End Sub

我尝试设置范围,但它粘贴的是单元格公式而不是值,因此这是我可以让它执行我需要执行的操作的唯一简单方法。归根结底,我需要将您在工作表 2 上看到的不同范围(每次运行时的长度可能不同)的内容作为值复制到工作表 1 中。

如果有人知道如何轻松地将不同工作表上的范围设置为等于当最后行发生变化时的变化值,并且它们位于不同工作表上的不同位置,那就太理想了。

例如在第二张上,它可能是

A1="XYZ"
B1="100000"
C1="52.00"
D1="office supplies"

A2="YZA"
B2="150000"
C2="-52.00"
D2="office supplies"

但在第一个工作表中,我们需要从 A11:12、B11:12、C11:12、D11:12 等开始粘贴这些值(第二天可能有 40 行而不是 2 行)。

最佳答案

使用工作表的保留.CodeName property可能不是一个好主意作为变量的名称;特别是因为它甚至不是该工作表的代号。

Sub FillInCoding()
    Dim lr As Long, JE As Worksheet, ws2 As Worksheet

    Set JE = ThisWorkbook.Worksheets(1)
    Set ws2 = ThisWorkbook.Worksheets(2)

    lr = ws2.Range("R65536").End(xlUp).Row

    With JE
        .Range("A11:G98567").ClearContents

        .Range("A11:B11").Resize(lr - 1, 2) = ws2.Range("AM2:AN" & lr).Value
        .Range("E11").Resize(lr - 1, 1) = ws2.Range("R2:R" & lr).Value
        .Range("G11").Resize(lr - 1, 1) = ws2.Range("AO2:AO" & lr).Value
    End With

End Sub

我选择使用一些修改后的工作表引用进行直接值(value)转移。前两列 AM 和 AN 到 A 和 B 可以加倍。请参阅我关于设置最后一行的评论。

参见How to avoid using Select in Excel VBA macros了解更多摆脱依赖 select 和 activate 来实现目标的方法。

关于excel - 为什么 Excel VBA 例程被另一个例程调用后不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082351/

相关文章:

vba - 如何使用 VBA 从 Excel 图表中删除一个系列

java - 设置单元测试数据的最佳方法

sql - Excel VBA查询超时错误

VBA无法复制和粘贴具有单个值的单元格

excel - Excel 中的递归函数和循环

vba - 一个 VBA For 循环中有多个范围?

excel - 我需要一个与 Excel 中的 NETWORKDAYS 相反或相反的函数

excel - 在 Excel 2016 数据模型中创建计算表

vba - Excel VBA 抓取网页

vba - 如何删除修改字符串以从新工作表中删除字母