首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VBA Excel筛选数据并复制到另一个工作表-新手警报

VBA Excel筛选数据并复制到另一个工作表-新手警报
EN

Stack Overflow用户
提问于 2015-10-08 15:13:43
回答 2查看 27.7K关注 0票数 3

嗨,当涉及到VBA Excel时,我是一个完全的新手。

我正在尝试过滤一个大小可变的电子表格,里面装满了数据,在一列中寻找一个设置词。找到后,我想将整个行复制到另一个工作表中。

因为它们可能不止一行包含这个单词,所以我不想覆盖之前复制的行。

这就是我为查找单词而创建的内容,但是如何将行复制到另一个工作表中呢?

代码语言:javascript
运行
复制
Sheets("Sheet1").Select                                 'Select datasheet
Range("A1").Select                                      'Set cell position to start search from

Do Until Selection.Offset(0, 4).Value = ""              'word to be searched is 4 cell in
                                                        'do what is required
    If Selection.Offset(0, 4).Value = "UKS" Then
        MsgBox "Found"                                  'Found it!
        'not sure how to copy row to another worksheet
    End If

'finish move on to next one in list
         Selection.Offset(1, 0).Select                  'move down 1 row
    Loop

    Range("A1").Select ' reset cell position

任何帮助都将不胜感激,请你解释一下它是如何工作的,因为我喜欢理解,而不仅仅是抄袭。

杰森

EN

回答 2

Stack Overflow用户

发布于 2016-03-07 16:27:53

看看下面,也许它给了你一些线索。不过,我会试着评论一下细节,让你更好地了解这件事。

我的示例稍微复杂一些,因为它一次对两列应用过滤,但它有助于您理解它的复杂性,因为您可以进一步应用它。

代码语言:javascript
运行
复制
 With Sheets("Source")
            .AutoFilterMode = False
        With .Range("$A$21" & ":" & "$C$" & 300)
             .AutoFilter Field:=1, Criteria1:=Array("April", "August", "Dezember", "Februar", "Januar", "Juli", "Juni", "Mai", "März", "November", "Oktober", "September"), Operator:=xlFilterValues
             .AutoFilter Field:=2, Criteria1:="<>"
             ActiveSheet.AutoFilter.Range.Copy
             Sheets("Chart").Select
             Range("A7").Select
            Sheets("Chart").Paste
         End With
        End With

那么,这是关于什么的:

代码的逻辑是

  • 对两列进行筛选列1按月份的名称(即德语)筛选,列2通过消除为空白/空的单元格来筛选元素

With Sheets(“源”) .AutoFilterMode = False With .Range("$A$21“& ":”& "$C$“& 300) .AutoFilter Field:=1,Criteria1:=Array(”4月“,”8月“,"Dezember","Februar","Januar","Juli","Juni","Mai","März",”11月“,"Oktober",“九月”),Operator:=xlFilterValues

  • 包含要对其应用筛选的表的工作表的名称是“源”。将.Autofiltering保留为false

.AutoFilterMode = False

  • 筛选值设置如下: column 1

.AutoFilter Field:=1,Criteria1:=Array(“4月”,“8月”,“12月”,“2月”,“1月”,"Juli","Juni","Mai","März",“11月”,"Oktober",“9月”),Operator:=xlFilterValues

第2列

.AutoFilter Field:=2,Criteria1:="<>“

  • 最后,但并非最不重要的是范围(应用过滤的表的单元格)

带有.Range的

(“$A$21”& ":“& "$C$”& 300)

在本例中,我的示例将过滤器应用于以A21开头、以C300结尾的一系列单元格(实际上是一个表)。

为什么是A21?,因为我的数据就是在那里被复制的。它总是从A21开始。

为什么是C300?因为最大行数永远不会超过(300-21)=279行我的数据模型在任何时候都不会超过279行未过滤的行数,你可以根据你的假设放一个更大的数字。如果有更多的行,请不要介意,因为我通过消除空白来过滤它们,请参见上面的内容。

顺便说一句,"kosher“版本是通过VBA计算行数,并在定义范围时使用它。

您可以简单地使用一个非常大的数字来覆盖表中可能的行数。

计算行数乍一看对你来说可能有点复杂,但最终会付出代价的。

假设您想要计算B列中的行数(变量) FinalRowChartSheet = Range("B7").End(xlDown).Row

祝你一切顺利。我希望我能帮到你。

别忘了给我的答案打分,如果你发现它useful.Thank你。

票数 3
EN

Stack Overflow用户

发布于 2015-10-08 15:41:32

下面是一个循环代码示例和一个过滤器代码示例。

代码语言:javascript
运行
复制
Sub loopMe()

    Dim sh As Worksheet, ws As Worksheet
    Dim LstR As Long, rng As Range, c As Range

    Set sh = Sheets("Sheet1")    'set the sheet to loop
    Set ws = Sheets("Sheet2")    'set the sheet to paste
    With sh    'do something with the sheet
        LstR = .Cells(.Rows.Count, "D").End(xlUp).Row    'find last row
        Set rng = .Range("D2:D" & LstR)    'set range to loop
    End With

    'start the loop
    For Each c In rng.Cells
        If c = "UKS" Then
            c.EntireRow.Copy ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(1)    'copy row to first empty row in sheet2
        End If
    Next c

End Sub

Sub FilterMe()
    Dim sh As Worksheet, ws As Worksheet
    Dim LstR As Long, rng As Range

    Set sh = Sheets("Sheet1")    'set the sheet to filter
    Set ws = Sheets("Sheet2")    'set the sheet to paste
    Application.ScreenUpdating = False
    With sh    'do something with the sheet
        LstR = .Cells(.Rows.Count, "D").End(xlUp).Row    'find last row
        .Columns("D:D").AutoFilter Field:=1, Criteria1:="UKS"
        Set rng = .Range("A2:Z" & LstR).SpecialCells(xlCellTypeVisible)    'Replace Z with correct last column
        rng.Copy ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(1)
        .AutoFilterMode = False
    End With

End Sub
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33009016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档