VBA:Application.CountIf的问题

时间:2017-06-04 16:06:03

标签: excel vba excel-vba countif

我有一个愚蠢的问题而且不知道为什么......

我想从其他工作簿中导入一些值。

步骤:

- 打开其他工作簿(来源)

- 获取所需的数据范围。

复制数据

- 获取节点*的出现次数,使目标表准备就绪。

- 切换到目标表并获取节点外观。

- 扩展目标表。

- 粘贴数据。

我的问题: 它只从Sorce表中获取CountIf值..

以下信息:

Sub import_kundenform()

Dim LR As Long
Dim rng As Range
Dim rng2 As Range
Dim ActRow As Integer

actwb = ActiveWorkbook.Name
actsh = ActiveSheet.Name

fName = Application _
.GetOpenFilename("Excel Files (*.xls), *.xls")

If fName = False Then
    Exit Sub
End If

Set wb = Workbooks.Open(fName)
startCell = 19
wb.Activate
LR = Cells(Rows.Count, "A").End(xlUp).Row

Set rng = Range("B1:B" & LR)
wb.Sheets(1).Range("A7:L" & LR).Copy
ival = Application.CountIf(rng, "node*")
Workbooks(actwb).Worksheets(actsh).Activate

ival2 = Application.CountIf(rng, "node*")
If ival > ival2 Then
    ActRow = ival - ival2 + startCell
    Range("A20:A" & ActRow).EntireRow.Insert
ElseIf ival < ival2 Then
    ActRow = ival2 - ival + startCell
    Range("A20:A" & ActRow).EntireRow.Insert
End If
Workbooks(actwb).Sheets(actsh).Range("A1").PasteSpecial Paste:=xlPasteValues

End Sub

如果您需要了解任何信息,请告知我们。

我希望你能帮助我。

1 个答案:

答案 0 :(得分:0)

wb.Activate
LR = Cells(Rows.Count, "A").End(xlUp).Row

Set rng = Range("B1:B" & LR)
wb.Sheets(1).Range("A7:L" & LR).Copy
ival = Application.CountIf(rng, "node*")

Workbooks(actwb).Worksheets(actsh).Activate
ival2 = Application.CountIf(rng, "node*")
If ival > ival2 Then

ivalival2都来自同一范围rng。激活其他工作簿或工作表不会更改rng范围变量。

你想在激活它之后从另一个wb / ws的同一范围获得ival2,试试

 ival2 = Application.CountIf(Range(rng.Address), "node*")
 '                           ^^^^^^^^^^^^^^^^^^ 

现在将引用相同的范围,但在活动工作表中。

但是,强烈建议完全放弃使用Activate内容并始终使用完全限定范围

  Set wb = Workbooks.Open(fName)
  startCell = 19
   'wb.Activate    ' <----------drop this
  With wb.Sheets(1)
    LR = .Cells(.Rows.count, "A").End(xlUp).row
    Set rng = .Range("B1:B" & LR)
    .Range("A7:L" & LR).Copy
    ival = Application.CountIf(rng, "node*")
  End With

  'Workbooks(actwb).Worksheets(actsh).Activate      ' <----------drop this
  With Workbooks(actwb).Worksheets(actsh)
    ival2 = Application.CountIf(.Range(rng.Address), "node*")
    If ival > ival2 Then
      ActRow = ival - ival2 + startCell
      .Range("A20:A" & ActRow).EntireRow.Insert
    ElseIf ival < ival2 Then
      ActRow = ival2 - ival + startCell
      .Range("A20:A" & ActRow).EntireRow.Insert
    End If
    .Range("A1").PasteSpecial Paste:=xlPasteValues
  End With