我有一个Sub,我打电话给另一个子。当它自己运行时它工作正常但是当它从另一个子系统调用它时它并没有完全正常工作。主要子保存默认值,然后:
MsgCodes.APPROVE_VALUE
这是不起作用的子,我认为可能是这种编码是复制和粘贴特殊的:
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Call FillInCoding
我尝试设置范围,但它粘贴了单元格公式而不是值,所以这是我能够做到我需要它做的唯一简单方法。在一天结束的时候,我需要你在第2页上看到的不同范围内的内容(每次运行时可能会有不同的长度)作为值复制到表1中。
如果有人知道如何轻松地将不同纸张上的范围设置为等于最终行更改时的变化值,并且它们位于不同纸张上的不同位置,这将是理想的。
例如,在第二张纸上,它可能是
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
但是在第一张中我们需要从A11:12,B11:12,C11:12,D11:12等开始粘贴这些值(第二天虽然可能有40行而不是2行)。
答案 0 :(得分: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
我选择使用一些修改后的工作表参考进行直接价值转移。前两列AM& AN到A和B可以加倍。请参阅我关于设置最后一行的评论。
有关远离依赖选择和激活以实现目标的更多方法,请参阅How to avoid using Select in Excel VBA macros。
答案 1 :(得分:2)
由于编写代码的方式,可能会出现几个不同的问题。
首先,您复制的范围大于您尝试将其粘贴的区域。在您的例子中:
Worksheets(2).Range("AM2:AM" & lastRow).Copy
Worksheets(1).Range("A11:A" & lastRow).PasteSpecial xlPasteValues
如果你的lastRow变量有100个条目,那么你只复制了99个单元格(2-100)。然而,你正试图将它们粘贴在只有90个单元格(11-100)的空间中。一个简单但又非常简单的简单修复就是简单地将差异添加到lastrow变量中:
Worksheets(2).Range("AM2:AM" & lastRow).Copy
Worksheets(1).Range("A11:A" & lastRow **+ 9**).PasteSpecial xlPasteValues
但更好的是,你不需要明确说明你要粘贴的范围。您可以只提供目标单元格,无论内容长度如何,它都会粘贴在那里:
Worksheets(2).Range("AM2:AM" & lastRow).Copy
Worksheets(1).Range("A11").PasteSpecial xlPasteValues
此外,您正在做的其他一些事情可能会在以后引起一些问题。 您将lastRow范围设置为第一个电子表格中列R的长度。根据您的复制和粘贴方式,我猜你希望你的lastRow长度是你正在复制的列的长度。您可以通过使用以下内容来实现:
lastRow = Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row
并将“A”更改为目标列。然后在每次复制新行时重置最后一行变量。一个例子是:
lastRow = Sheets("Sheet2").Range("AM" & Rows.Count).End(xlUp).Row
Sheets("Sheet2").Range("AM2:AM" & lastRow).Copy
Sheets("Sheet1").Range("A11").PasteSpecial xlPasteValues
lastRow = Sheets("Sheet2").Range("AN" & Rows.Count).End(xlUp).Row
Sheets("Sheet2").Range("AN2:AN" & lastRow).Copy
Sheets("Sheet1").Range("B11").PasteSpecial xlPasteValues
最后,我更改了工作表(1)以按名称调用工作表,因为我发现此方法更直观,并且允许您识别要复制和粘贴的工作表,即使您或用户已将其移动页面顺序。
所以你的最终代码如下所示。绝对有更简洁的方法来编写所有这些(包括将大量重复的代码转换为变量代码),但我认为这是您正在编写的代码中合乎逻辑的下一步:
Dim LastRow as long
lastRow = Sheets("Sheet2").Range("AM" & Rows.Count).End(xlUp).Row
Sheets("Sheet2").Range("AM2:AM" & lastRow).Copy
Sheets("Sheet1").Range("A11").PasteSpecial xlPasteValues
lastRow = Sheets("Sheet2").Range("AN" & Rows.Count).End(xlUp).Row
Sheets("Sheet2").Range("AN2:AN" & lastRow).Copy
Sheets("Sheet1").Range("B11").PasteSpecial xlPasteValues
lastRow = Sheets("Sheet2").Range("R" & Rows.Count).End(xlUp).Row
Sheets("Sheet2").Range("R2:R" & lastRow).Copy
Sheets("Sheet1").Range("E11").PasteSpecial xlPasteValues
lastRow = Sheets("Sheet2").Range("A0" & Rows.Count).End(xlUp).Row
Sheets("Sheet2").Range("A02:A0" & lastRow).Copy
Sheets("Sheet1").Range("G11").PasteSpecial xlPasteValues
答案 2 :(得分:1)
需要注意的一点是,您可以跳过复制/粘贴部分,只需将两个范围值设置为相等:
Worksheets(2).Range("AM2:AM" & lastRow).Copy
Worksheets(1).Range("A11:A" & lastRow).PasteSpecial xlPasteValues
与
相同Worksheets(1).Range("A11:A" & lastRow).Value = Worksheets(2).Range("AM2:AM" & lastRow).Value
至于使用不同的工作表,我强烈建议创建两个变量来保存它们,并直接(并明确地)使用每个工作表:
Sub test()
Dim ws1 As Worksheet, ws2 As Worksheet
' Let's set "Sheet1" to be ws1, and "Sheet2" to be ws2
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
'Now, use WITH to work in a specific sheet.
With ws1
.Range("A1").Value = "Cell A1" ' Note the . at the beginning of Range(). This makes sure that the range you're using is
' on sheet1, not any other sheet
'The next line is the SAME as using Range("A1"), only using Cells(row,Column). NOTE the . before Range() AND Cells()
.Range(.Cells(1, 1), .Cells(1, 1)).Value = "Cell A1"
End With
With ws2
.Range("A1").Value = "Sheet2, Cell A1"
End With
'Let's now say you want sheet1, A1 to be put in Sheet2, A1:
' [copy TO range] = [where you want to copy FROM]
ws2.Range("A1").Value = ws1.Range("A1").Value
'Or, of course, we can use ranges
ws2.Range("A1:B100").Value = ws1.Range("A1:B100").Value
' is same as
ws2.Range(ws2.Cells(1, 1), ws2.Cells(100, 2)).Value = ws1.Range(ws1.Cells(1, 1), ws1.Cells(100, 2)).Value
' is same as
With ws2
.Range(.Cells(1, 1), .Cells(100, 2)).Value = ws1.Range(ws1.Cells(1, 1), ws1.Cells(100, 2)).Value
End With
End Sub
希望以上内容很明确,您可以看到如何编辑宏以确保将数据和数据粘贴到正确的页面。
编辑:Andddd我刚刚注意到你确实已经设置了一些工作表 - 所以只需使用上面的那些。重新阅读后,我想我解释了你的问题(或至少部分问题)......
Edit2:哇,好吧,所以我完全误解了你的问题。对于那个很抱歉!我想我会留在这里,因为它解释了设置值,没有复制/粘贴。对不起伙伴,我再看看你的问题。 (如果更熟悉StackOverflow的人可以告诉我,我应该在这里保留这个答案,还是只是完全删除?论坛指南是什么?)
答案 3 :(得分:0)
我很欣赏所给出的答案,我从所有人那里学到了一些东西。我最终需要做的是让宏运行并完全正确地复制数据:
calcState = Application.Calculation
'when this was turned off before the next coding it didn't copy over the company name properly (column A)
Application.Calculation = calcState
'Puts the coding into the JE Sheet
Call FillInCoding
'turning it back off to speed up the final bits of coding
Application.Calculation = xlCalculationManual
我不确定为什么将“计算”模式设置为“手动”而不是“自动”使得有时列在A列中列出的示例中没有正确复制而不是复制(从第二列开始)通过
之类的东西来表示第一页A1 "XYZ"
A2 "YZA"
A3 "GHI"
A4 "XYZ"
它正在推出:
A1 "XYZ"
A2 "XYZ"
A3 "XYZ"
A4 "XYZ"
对不起我觉得我发生的事情并不是最清楚的,我的编码本身就是整体工作,但@ Jeeped显然更清洁,更简单,更好。我对这个网站的编码仍然相当新。
我有了从https://blogs.office.com/2009/03/12/excel-vba-performance-coding-best-practices/将这些选项从自动转为手动的想法。它确实使父宏显着更快地按照那里的建议进行,但我想它可能会导致问题。