我非常熟悉数据透视表vlookup
,但感觉这可以通过VBA
完成。
以下是我要做的事情:
Sheet 1
:带标题的数据表。
Sheet 2
:使用特定外观和数据格式化的摘要表只能粘贴到从row 10
开始的工作表中。
sheet 2, B5
中,有一个下拉列表,可让您选择名称。 Sheet 2 B5
中的值是否与Sheet 1 Column A
匹配。sheet 1
)并检查column A
是否与Sheet 2 B5
匹配。 Sheet 2 B5
匹配Sheet 1
Column A
,请复制Sheet 1
列B, C, D, E, H, I, J, K, L, M, N, R, S, T, U, V, W, X, Y
,Sheet 2 B5
值,INTO sheet 2
从row 10
开始。 其他说明
- Sheet 1
中的格式无法复制到Sheet 2
。我只需要内容。
- 运行代码的按钮位于sheet 2
。 (因此sheet 2
是宏运行时的活动表)。
我的代码到目前为止......
Sub Report ()
Dim finalrow As Integer, i as Integer, name as String
Sheets("Sheet 2").Range("A10:N29").ClearContents
name = Sheets("Sheet 2").Range("B5").Value
For i = 2 To Sheets("Sheet 1").Range("B" & Rows.Count).End(xlUp).Row
If Cells(i, 1) = name Then
Range(Cells(i, 2), Cells(i, 25)).Select
Selection.Copy
Worksheets("Sheet 2").Select
erow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
ActiveSheet.Cells(erow, 1).Select
ActiveSheet.PasteSpecial xlPasteFormulasAndNumberFormats
End If
Next i
End Sub
但我一直在
运行时错误9.
答案 0 :(得分:0)
运行时错误主要是由于未正确寻址单元格而发生的。如果使用显式编码,则不太可能出现这些错误,并且您的代码也很容易辨认。也可以使用评论。
Option Explicit
Sub Report ()
'Declare variables
Dim name as String
Dim wsh1 As Worksheet, wsh2 As Worksheet
Dim erow As Long, i as Long
'Set the sheets
Set wsh1 = ThisWorkbook.Worksheets("Sheet 1")
Set wsh2 = ThisWorkbook.Worksheets("Sheet 2")
'clean destination worksheet
wsh2.Range("A10:N29").ClearContents
name = wsh2.Range("B5").Value 'condition for copying
'loop over reference sheet
For i = 2 To wsh1.Range("B" & Rows.Count).End(xlUp).Row
'Check if the row meets the condition
If wsh1.Cells(i, 1) = name Then
wsh1.Range(wsh1.Cells(i, 2), wsh1.Cells(i, 25)).Copy 'copy the row
erow = wsh2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row 'find last row in wsh2
wsh2.Cells(erow, 1).PasteSpecial xlPasteFormulasAndNumberFormats 'paste only values
End If
Next i
End Sub
由于OP提到它应该总是在第10行,那么这比使用最后一行更好:
在代码的开头和for循环之外定义erow = 10
。然后你的if-block应该是这样的:
If wsh1.Cells(i, 1) = name Then 'Check if the row meets the condition
wsh1.Range(wsh1.Cells(i, 2), wsh1.Cells(i, 25)).Copy 'copy the row
wsh2.Cells(erow, 1).PasteSpecial xlPasteFormulasAndNumberFormats 'paste only values
erow = erow + 1
End If