【问题标题】:Need to fill a sheet with consecutive rows data based on value in another worksheet需要根据另一个工作表中的值用连续行数据填充工作表
【发布时间】:2015-08-19 20:11:33
【问题描述】:

好的,情况就是这样。我创建了一个包含 5 张工作表的工作簿。

第一张表有 QTY、DESCRIPTION、PRICE 和一些其他数据的列,但这些是相关的。

根据输入的数据,填写一份人工发票和几份订单。那工作正常。

我遇到的问题是我还需要它来填写一张名为 Contract 的表格。主表上大约有 75 项,但合同永远不会超过 30 项。

我只需要将主表上 QTY 值非零的行连续拉到合同表上,以便在数据集用完非零 QTY 的项目之前没有空白行主表。

I.E. 如果主工作表上有 15 个非连续行,且 QTY 的值非零,则在合同工作表上,我需要 30 行中的前 15 行从主工作表中提取 QTY、DESCRIPTION、PRICE具有非零数量值的工作表行。

我希望我是有道理的..这让我很难过!

谢谢

编辑:我刚刚意识到,我只需要将 QTY 和 Contract Cost 的非零值的数据提取到合同表中!哎呀!

【问题讨论】:

    标签: vba excel vlookup


    【解决方案1】:

    试试这个。我假设您需要将数据从主数据拉到合同。我希望我能正确回答您的问题
    主工作表:

    合同工作表(结果)

    Option Explicit
    Dim MyWorkbook As Workbook
    Dim MyWorksheet As Worksheet
    Dim MyOutputWorksheet As Worksheet
    
    Sub PullData()
    Set MyWorkbook = Workbooks(ActiveWorkbook.Name)
    Set MyWorksheet = MyWorkbook.Sheets("Main")
    Set MyOutputWorksheet = MyWorkbook.Sheets("Contract")
    
        Dim myValue As Long
        Dim RowPointer As Long
    
        For RowPointer = 2 To MyWorksheet.Cells(Rows.Count, "B").End(xlUp).Row
            If MyWorksheet.Range("A" & RowPointer).Value > 0 And MyWorksheet.Range("A" & RowPointer).Value <> "" Then
                If MyOutputWorksheet.Cells(Rows.Count, "B").End(xlUp).Row > 15 Then
                    Exit Sub
                End If
                MyWorksheet.Range(("A" & RowPointer) & ":C" & RowPointer).Copy Destination:=MyOutputWorksheet.Range("A" & MyOutputWorksheet.Cells(Rows.Count, "B").End(xlUp).Row + 1)
            End If
        Next RowPointer
    
    
    End Sub
    

    【讨论】:

    • 我刚刚意识到,我只需要将 QTY 和 Contract Cost 的非零值的数据拉到合同表中!哎呀!
    • 我知道我将在 IF 语句中添加和 AND 以验证合同成本的非零值,这很棒!我是否只是添加一个宏按钮并使用此代码?
    • 是的,您只需要添加一个按钮并将宏分配给该按钮即可。
    • 那段代码看起来很棒,有一件事我没有提到,输出行不包含输入行的所有数据。所以我只需要输出某些列。此外,我需要它们导入第二张合同表上的某些行和列。主表上的 A 列从第 17 行开始转到 A 列。 B 到 B , E 到 D F 到 E 都从合同表上的第 17 行开始。
    • 如果您需要将某些行导入到第二张工作表(合同工作表),您需要有规则(例如项目名称包含某些字符/单词,该行必须被导入并且它始终位于在主工作表的第 17 行等)用于某些行将它们写为宏中的代码逻辑,否则我建议在这种情况下手动复制将是一个更好的解决方案。
    【解决方案2】:

    不确定这是否正是您要查找的内容,但如果您想在宏中执行此操作,我相信这样的方法会起作用:

    Sub test()
    '
    ' test Macro
    '
    
    '
        Dim i As Integer
        Range("A:A").Select
        i = Application.WorksheetFunction.Count(Selection) + 1
        Sheets("Sheet2").Select
        Dim numZero As Integer
        numZero = 0
        Dim temp As Integer
        For j = 2 To i
            temp = Range("Sheet1!A" & j).Value
            If temp = 0 Then
                numZero = numZero + 1
            Else
                Range("A" & j - numZero).Select
                Selection.Formula = "=IF(Sheet1!A" & j & "<> 0, Sheet1!A" & j & ",FALSE)"
                Range("B" & j - numZero).Select
                Selection.Value = "=Sheet1!B" & j
                Range("C" & j - numZero).Select
                Selection.Value = "=Sheet1!C" & j
            End If
        Next j
    End Sub
    

    这不是最干净的宏,因为我很快就把它放在一起,但它可以完成工作,如果你的数据不是很大的话应该足够快。

    【讨论】:

    • 我刚刚意识到,我只需要将 QTY 和 Contract Cost 的非零值的数据拉到合同表中!哎呀!
    • 我可以添加另一个包含合同价格单元格数据的验证器,并在语句中说 IF temp=0 OR temp2=0 then numZero=numZero+1 子句吗?
    • 是的,应该可以。你想设置 temp2 = Range("Sheet1!D" &j).Value 假设 D 列包含合同成本
    • 我有点落后了,但是在实现了页面上的所有解决方案后[谢谢大家!]我意识到我需要添加更多条件!所以我只需要输出某些列。我还需要它们输入到第二张合同表上的某些行和列。 MAIN 表上的 A 列从 CONTRACT 表的第 17 行开始转到 A 列。 B 到 B、E 到 D、F 到 E,都从合同表的第 17 行开始。合同表上的第 17-42 行将包含数据。
    【解决方案3】:

    考虑以下屏幕截图。左边是“Main”表,右边是“Contract”表。

    “合同”表上的单元格 A2 有公式

    =IFERROR(INDEX(Main!A:A,SMALL(IF(ISNUMBER(Main!$A$1:$A$10)*(Main!$A$1:$A$10>0),ROW(Main!$A$1:$A$10),""),ROW(A1))),"")
    

    这是一个数组公式,必须用Ctrl+Shift+Enter确认。然后向下复制。

    调整单元格引用以反映您的情况。使用带有行号的范围。不要将整列引用与数组公式一起使用。

    编辑:要仅返回除了现有条件之外成本大于 0 的行,请使用此公式,也可以使用 Ctrl-Shift-Enter 输入数组。

    =IFERROR(INDEX(Main!A:A,SMALL(IF(ISNUMBER(Main!$A$1:$A$10)*(Main!$A$1:$A$10>0)*(Main!$c$1:$c$10>0),ROW(Main!$A$1:$A$10),""),ROW(A1))),"")
    

    【讨论】:

    • 我刚刚意识到,我只需要将 QTY 和 Contract Cost 的非零值的数据拉到合同表中!哎呀!
    • 我能否像判断数量是否大于零一样,对 IF 语句进行 AND 来判断合约价格是否大于零?
    • 我添加了一个可以做到这一点的公式。
    • 我有点落后了,但是在实现了页面上的所有解决方案后[谢谢大家!]我意识到我需要添加更多条件!所以我只需要输出某些列。我还需要它们输入到第二张纸(合同表)上的某些行和列。 MAIN 表上的 A 列从 CONTRACT 表的第 17 行开始转到 A 列。 B 到 B、E 到 D、F 到 E,都从合同表的第 17 行开始。合同表上的第 17-42 行将包含数据。
    • 哇。稍安毋躁。你刚刚完全改变了游戏。这就像订购大众甲壳虫,然后添加兰博基尼的所有功能。坚持你原来的问题。标记那个原始问题的答案。那是竞争环境,你不应该改变它。如果您有后续问题,或者您的情况发生变化,您可以免费提出新问题。也许这一次你想在派人去追逐野鹅然后在没有赞成或回答标记的情况下退出之前考虑你的真实要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2020-05-06
    相关资源
    最近更新 更多