#excel #vba
#excel #vba
Вопрос:
Я использую этот код для фильтрации данных, которые мне нужны, чтобы я мог копировать и вставлять в другую книгу.
С фильтром проблем нет, но счетчик возвращает мне неправильное количество видимых строк.
Count1 = .SpecialCells(xlCellTypeVisible).Rows.Count
Я тоже пробовал
Count1 = Rows.SpecialCells(xlCellTypeVisible).Count
, но это выдает ошибку.
Sub ListForeignTrans()
Dim wsCopy As Worksheet
Dim wsDest As Worksheet
Dim lCopyLastRow As Long
Dim lDestLastRow As Long
Dim Rng As Range
Dim CoName As Range
Dim Count1 As Long
Set wsDest = ThisWorkbook.Worksheets("List Foreign Trans")
Set Rng = wsDest.Range("E2") 'To be use in the directory
Set CoName = wsDest.Range("E1") 'To be use in the directory
'Open workbook
Workbooks.Open Filename:= _
"\172.17.10.134Finance Tower042_Witholding Tax" amp; CoName amp; "" amp; Rng amp; "" amp; CoName amp; " Exp GL " amp; Rng amp; ".XLSX"
'Filter
With Workbooks(CoName amp; " Exp GL " amp; Rng amp; ".XLSX").Worksheets("Sheet1").Range("A1")
.AutoFilter Field:=19, Criteria1:="<>MYR" _
, Criteria2:="<>", Operator:=xlAnd
.AutoFilter Field:=20, Criteria1:="<>0.00"
.AutoFilter Field:=2, Criteria1:="<> "
Count1 = .SpecialCells(xlCellTypeVisible).Rows.Count 'Count Row
'If only 1 row close workbook, else proceed to copy from the workbook open by previous step to current workbook.
If Count1 = 1 Then GoTo Line1 Else
Set wsCopy = Workbooks(CoName amp; " Exp GL " amp; Rng amp; ".XLSX").Worksheets("Sheet1")
lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "Q").End(xlUp).Offset(1).Row
wsCopy.Range("B2").Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Selection.Copy _
wsDest.Range("Q" amp; lDestLastRow)
End With
Line1:
'Close Workbook
Workbooks(CoName amp; " Exp GL " amp; Rng amp; ".XLSX").Close SaveChanges:=False
End Sub
Должно быть 3 строки. Но результат продолжает давать мне 1 строку.
Комментарии:
1. Вы используете специальные ячейки для одной ячейки
2. @Тим Уильямс Как мне это решить? Поместить диапазон перед .SpecialCells?
3. Попробуйте
.CurrentRegion
после.Range("a1")
4. @TimWilliams Я пробовал, но он насчитывает более 3 строк. Спасибо за ваше предложение, и я нашел решение.
Ответ №1:
Я нашел решение, в соответствии с которым добавлены эти строки:
Set Rng1 = ActiveSheet.AutoFilter.Range
Count1 = Rng1.Columns(2). _
SpecialCells(xlCellTypeVisible).Count
Ниже приведен полный код:
Sub ListForeignTrans()
Dim wsCopy As Worksheet
Dim wsDest As Worksheet
Dim lCopyLastRow As Long
Dim lDestLastRow As Long
Dim Rng As Range
Dim Rng1 As Range
Dim CoName As Range
Dim Count1 As Long
Set wsDest = ThisWorkbook.Worksheets("List Foreign Trans")
Set Rng = wsDest.Range("E2") 'To be use in the directory
Set CoName = wsDest.Range("E1") 'To be use in the directory
' List of Foreign Trans
'Open workbook
Workbooks.Open Filename:= _
"\172.17.10.134Finance Tower042_Witholding Tax" amp; CoName amp; "" amp; Rng amp; "" amp; CoName amp; " Exp GL " amp; Rng amp; ".XLSX"
'Filter
With Workbooks(CoName amp; " Exp GL " amp; Rng amp; ".XLSX").Worksheets("Sheet1").Range("A1")
.AutoFilter Field:=19, Criteria1:="<>MYR" _
, Criteria2:="<>", Operator:=xlAnd
.AutoFilter Field:=20, Criteria1:="<>0.00"
.AutoFilter Field:=2, Criteria1:="<> "
Set Rng1 = ActiveSheet.AutoFilter.Range
Count1 = Rng1.Columns(2). _
SpecialCells(xlCellTypeVisible).Count
'If only 1 row close workbook, else proceed to copy from the workbook open by previous step to current workbook.
If Count1 = 1 Then GoTo Line1 Else
Set wsCopy = Workbooks(CoName amp; " Exp GL " amp; Rng amp; ".XLSX").Worksheets("Sheet1")
lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "Q").End(xlUp).Offset(1).Row
wsCopy.Range("B2").Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Selection.Copy _
wsDest.Range("Q" amp; lDestLastRow)
End With
Line1:
'Close Workbook
Workbooks(CoName amp; " Exp GL " amp; Rng amp; ".XLSX").Close SaveChanges:=False
End Sub