Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于列出名称的VBA宏代码_Vba_Excel_For Loop - Fatal编程技术网

用于列出名称的VBA宏代码

用于列出名称的VBA宏代码,vba,excel,for-loop,Vba,Excel,For Loop,我有一张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 = Workshe

我有一张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
试试rhis

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
试试rhis

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

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

我的假设

  • 原始数据见表1,如下面的快照所示
  • 您希望在表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
    
    快照


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

    我的假设

  • 原始数据见表1,如下面的快照所示
  • 您希望在表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
    
    快照


    欢迎来到StackOverflow:)您尝试了什么?您在哪里卡住了?子复制单元格()将sh1设置为工作表,将sh2设置为工作表,将sh2设置为工作表,将sh1设置为长,将sh1设置为长,将sh1设置为长,将sh1设置为长sh1=工作表(“Sheet1”)将sh2=工作表(“Sheet2”)设置为sh1。单元格(Rows.Count,“F”).End(xlUp)。如果sh1设置为长,则将i=1的行设置为最后行1。单元格(i,“F”).Value>20,然后是sh2.Range(“A”&i).Value=sh1.Cells(i,“F”)。Value End如果下一个i End Sub我尝试过这个方法,它会起作用,但列中的文本也会复制到新的工作表中,空格保持原样。他们没有被忽视。如果您不介意,请先编辑您的问题,然后将代码粘贴到那里,好吗?阅读注释中的代码确实很困难。:)好的,我知道你在做什么了。等一下。发布回答欢迎使用StackOverflow:)您尝试了什么,您遇到了什么困难?子复制单元格()将sh1设置为工作表,将sh2设置为工作表,将sh2设置为工作表,将sh1设置为长,将sh1设置为长,将sh1设置为长,将sh1设置为长,将sh1设置为长sh1=工作表(“Sheet1”)将sh2=工作表(“Sheet2”)设置为长sh1=sh1。单元格(Rows.Count,“F”).End(xlUp)。如果sh1设置为长,则将i=1的行设置为最后一行。单元格(i,“F”).Value>20,然后是sh2.Range(“A”&i).Value=sh1.Cells(i,“F”)。Value End如果下一个i End Sub我尝试过这个方法,它会起作用,但列中的文本也会复制到新的工作表中,空格保持原样。他们没有被忽视。如果您不介意,请先编辑您的问题,然后将代码粘贴到那里,好吗?阅读注释中的代码确实很困难。:)好的,我知道你在做什么了。等一下。发布回答您向se检查是否应复制值的行应测试
    >40
    ,而不是
    >20
    对吗?:)从OP注释复制的代码-那么OP或注释哪一个是正确的?建议:在
    中添加第二行,如果。。。如果
    也要复制名称列,则结束。Hi。如果我需要添加另一个if条件,我应该怎么做?提前感谢您向se检查是否应复制值的行应测试
    >40
    ,而不是
    >20
    对吗?:)从OP注释复制的代码-那么OP或注释哪一个是正确的?建议:在
    中添加第二行,如果。。。如果
    也要复制名称列,则结束。Hi。如果我需要添加另一个if条件,我应该怎么做?提前谢谢回答得好,布局得好回答得好,布局得好