【问题标题】:Macro works on my Excel but not someone elses宏适用于我的 Excel,但不适用于其他人
【发布时间】:2019-01-03 16:42:18
【问题描述】:

我在下面创建了宏。它应该根据它找到一个特定的行,复制它,删除它并将其粘贴到同一工作簿中的单独工作表上。

它对我来说非常好,但对我的同事不适用。绿色代码工作并正确移动行,红色代码不起作用。它会找到行并删除它们,但不会将它们移动到另一张纸上。

实际代码:

 With ActiveSheet
  If .AutoFilterMode Then .AutoFilterMode = False
  .Range("A1:Q1").AutoFilter 8, "*L5P*"
  With .AutoFilter.Range.Offset(1)
     .Copy Sheets("L5p Orders").Range("A" & Rows.Count).End(xlUp).Offset(1)
     .EntireRow.Delete
  End With
  .AutoFilterMode = False
End With

With ActiveSheet
  If .AutoFilterMode Then .AutoFilterMode = False
  .Range("A1:Q1").AutoFilter 8, "*Powerstroke 6.0L*"
  With .AutoFilter.Range.Offset(1)
     .Copy Sheets("L5p Orders").Range("A" & Rows.Count).End(xlUp).Offset(1)
     .EntireRow.Delete
  End With
  .AutoFilterMode = False
End With

With ActiveSheet
  If .AutoFilterMode Then .AutoFilterMode = False
  .Range("A1:Q1").AutoFilter 8, "*Powerstroke 7.3L*"
  With .AutoFilter.Range.Offset(1)
     .Copy Sheets("L5p Orders").Range("A" & Rows.Count).End(xlUp).Offset(1)
     .EntireRow.Delete
  End With
  .AutoFilterMode = False
End With

With ActiveSheet
  If .AutoFilterMode Then .AutoFilterMode = False
  .Range("A1:Q1").AutoFilter 8, "*Nissan Titan*"
  With .AutoFilter.Range.Offset(1)
     .Copy Sheets("L5p Orders").Range("A" & Rows.Count).End(xlUp).Offset(1)
     .EntireRow.Delete
  End With
  .AutoFilterMode = False
End With

此人与我拥有相同版本的 Excel,并且也像我一样运行 Windows 10。

想法?

【问题讨论】:

  • 有错误吗?如果没有,您是否使用On Error Resume Next?如果是这样,不要(永远!)排除故障的好方法是单步执行代码(使用 F8)在另一台机器上,逐行,密切关注任何变量。这应该有助于确定问题出在哪里。请参阅 Chip Pearson 的Debugging VBA 了解更多信息。
  • @ashleedawg 没有调试错误,代码完全一样。
  • 如果我不得不在这里猜测,我建议在每次应用自动过滤器后弹出DoEvents。在您尝试复制数据之前,失败的两个可能没有完成在您的同事机器上创建过滤器。如果你有更好的规格。机器那么他们可能是问题吗?
  • 明确声明 ActiveSheet 将是什么,并将所有工作表引用绑定到正在使用的显式工作簿。

标签: vba excel


【解决方案1】:

这是一些多余的代码。获取这些块中的任何一个并将其提取到自己的参数化过程中:

Private Sub CopyAndFilter(ByVal fromSheet As Worksheet, ByVal toSheet As Workshet, ByVal filter As String)
    With fromSheet
      If .AutoFilterMode Then .AutoFilterMode = False
      .Range("A1:Q1").AutoFilter 8, filter
      With .AutoFilter.Range.Offset(1)
         .Copy toSheet.Range("A" & Rows.Count).End(xlUp).Offset(1)
         .EntireRow.Delete
      End With
      .AutoFilterMode = False
    End With
End Sub

现在你的调用代码是:

Dim source As Worksheet
Set source = ActiveSheet

Dim destination As Worksheet
Set destination = ThisWorkbook.Worksheets("L5p Orders")

CopyAndFilter source, destination, "*L5P*"
CopyAndFilter source, destination, "*Powerstroke 6.0L*"
CopyAndFilter source, destination, "*Powerstroke 7.3L*"
CopyAndFilter source, destination, "*Nissan Titan*"

这样,您只需取消引用 sourcedestination 工作表一次,并且大大减少了重复,从而确保所有块都以相同的方式工作。

【讨论】:

    【解决方案2】:

    不是答案,但您的代码将更易于管理:

    For Each t In Array("*L5P*", "*Powerstroke 6.0L*", "*Powerstroke 7.3L*", "*Nissan Titan*")
    
        With ActiveSheet
            If .AutoFilterMode Then .AutoFilterMode = False
            .Range("A1:Q1").AutoFilter 8, t
            With .AutoFilter.Range.Offset(1)
               .Copy Sheets("L5p Orders").Range("A" & Rows.Count).End(xlUp).Offset(1)
               .EntireRow.Delete
            End With
            .AutoFilterMode = False
        End With
    
    Next t
    

    ...您可以确定每个术语都得到完全相同的处理...

    【讨论】:

      【解决方案3】:

      我怀疑问题在于,在您同事的机器上,正在应用的过滤器在复制数据之前没有完成。在过滤器应用程序之后添加DoEvents 应该会导致一切停止并等待过滤器完成。

      当我在那里时,我也稍微缩短了过程:

      Sub test_this()
      
          Dim fltr As Variant
      
          With ActiveSheet
      
              For Each fltr In Array("*L5P*", "*Powerstroke 6.0L*", "*Powerstroke 7.3L*", "*Nissan Titan*")
      
                If .AutoFilterMode Then .AutoFilterMode = False
                DoEvents 'make sure removing filter finishes
                .Range("A1:Q1").AutoFilter 8, fltr
                DoEvents 'make sure applying filter finishes
                With .AutoFilter.Range.Offset(1)
                   .Copy Sheets("L5p Orders").Range("A" & Rows.Count).End(xlUp).Offset(1)
                   .EntireRow.Delete
                End With
                .AutoFilterMode = False
                DoEvents 'make sure removing filter finishes
              Next
      
          End With
      
      End Sub
      

      编辑:对不起,我重新考虑了。我认为在每次过滤器更改后对 DoEvents 很重要,而不仅仅是在应用过滤器时。为此更改了代码。

      【讨论】:

      • 我什至建议在.Copy.EntireRow.Delete 之间放置一个DoEvents,如果您正在谈论可能复制大量数据,因为复制可能需要一段时间。
      猜你喜欢
      • 2021-10-09
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多