【问题标题】:VBA macro code for listing names用于列出名称的 VBA 宏代码
【发布时间】:2012-08-16 10:10:18
【问题描述】:

我有一个 Excel 工作表,其中名称为一列,工作时间为下一列的值。

我想将值大于 40 的名称复制到新工作表中,并且列中没有任何空格。新的工作表应该有名字和工作时间;值列中的任何文本都应被忽略。

Sub CopyCells()
    Dim sh1 As Worksheet, sh2 As Worksheet 
    Dim j As Long, i As Long, lastrow1 As Long 

    Set sh1 = Worksheets("Sheet1") 
    Set sh2 = Worksheets("Sheet2") 
    lastrow1 = sh1.Cells(Rows.Count, "F").End(xlUp).Row 

    For i = 1 To lastrow1 
        If sh1.Cells(i, "F").Value > 20 Then 
            sh2.Range("A" & i).Value = sh1.Cells(i, "F").Value 
        End If 
    Next i 
End Sub

【问题讨论】:

  • 欢迎来到 StackOverflow :) 你尝试过什么,你在哪里卡住了?
  • Sub CopyCells() Dim sh1 As Worksheet, sh2 As Worksheet Dim j As Long, i As Long, lastrow1 As Long Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") lastrow1 = sh1.Cells(Rows.Count, "F").End(xlUp).Row For i = 1 To lastrow1 If sh1.Cells(i, "F").Value > 20 Then sh2.Range("A" & i).Value = sh1.Cells(i, "F").Value End If Next i End Sub 我试过了,这行得通,但列中的文本也被复制到新工作表中,空白保持原样。他们没有被忽视。提前致谢
  • 如果您不介意可以编辑您的问题,然后将代码粘贴到那里吗?在 cmets 中阅读代码真的很困难。 :)
  • 好的,我知道你在做什么。一瞬间。发布答案

标签: vba excel for-loop


【解决方案1】:

我建议使用AutoFilter 进行复制和粘贴,因为它比循环更快。请参阅下面的示例。

我的假设

  1. 原始数据在工作表 1 中,如下图所示
  2. 您希望工作表 2 中的输出如下图所示

代码

我已经对代码进行了注释,以便您理解它不会有问题。

Option Explicit

Sub Sample()
    Dim wsI As Worksheet, wsO As Worksheet
    Dim lRow As Long
    
    '~~> Set the input sheet
    Set wsI = Sheets("Sheet1"): Set wsO = Sheets("Sheet2")
    
    '~~> Clear Sheet 2 for output
    wsO.Cells.ClearContents
    
    With wsI
        '~~> Remove any existing filter
        .AutoFilterMode = False
        
        '~~> Find last row in Sheet1
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
        
        '~~> Filter Col B for values > 40
        With .Range("A1:B" & lRow)
            .AutoFilter Field:=2, Criteria1:=">40"
            '~~> Copy the filtered range to Sheet2
            .SpecialCells(xlCellTypeVisible).Copy wsO.Range("A1")
        End With
        
        '~~> Remove any existing filter
        .AutoFilterMode = False
    End With
    
    '~~> Inform user
    MsgBox "Done"
End Sub

快照

【讨论】:

    【解决方案2】:

    试试犀牛

    Sub CopyCells()
        Dim sh1 As Worksheet, sh2 As Worksheet
        Dim j As Long, i As Long, lastrow1 As Long
        Set sh1 = Worksheets("Sheet1")
        Set sh2 = Worksheets("Sheet2")
        lastrow1 = sh1.Cells(Rows.Count, "F").End(xlUp).Row
        j = 1
        For i = 1 To lastrow1
            If Val(sh1.Cells(i, "F").Value) > 20 Then
                sh2.Range("A" & j).Value = sh1.Cells(i, "F").Value
                j = j + 1
            End If
        Next i
    End Sub
    

    【讨论】:

    • 检查是否应该复制值的行应该测试> 40,而不是> 20,对吗? :)
    • 从 OP 注释中复制的代码 - 那么哪个是正确的,OP 还是注释?
    • 建议:在If ... End If 中添加第二行以复制名称列。
    • 嗨。如果我需要添加另一个 If 条件,我该怎么办?提前致谢
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2018-04-23
    相关资源
    最近更新 更多