如果在另一个工作簿中找到或未找到单元,则创建各种范围

fonzy16

我一直在努力工作一天半的代码。我有一个超过50列18000行的电子表格。我已经能够基于H(OpsCol)列中的空白单元格来确定由“ AllEntRg”定义的A列中较小范围的单元格。我陷入循环的底部。对于EntityRg,我将遍历“ AllEntRg”中的每个单元格,如果未在BudWb Wk4中定义的Range CCRg中找到它,那么我想创建所有这些单元格的范围。下一个选项CostCRg,我想为CCrg中找到的所有单元格定义一个范围。

我已经通过选择单个单元格对其进行了测试,它提供了我想要的结果,但是当我将其放入循环中时,我得到了以下两个结果:对于EntityRg,定义的range.address与AllEntRg相同(这是情况并非如此)。对于CostCRg,我遇到了错误。我不确定我没有正确定义。我已经在这里停留了很长一段时间,并且也尝试过使用Match Function。同样,单独运行也可以,但是在循环中,我得到了这些意外的结果。我对可能收到的反馈意见很感兴趣。谢谢。

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

    Dim wb As Workbook
    Dim BudWkb As Workbook
    Dim Wk2 As Worksheet
    Dim PNLWkb As Workbook
    Dim fpath As String
    Dim fname As String

    Set BudWkb = Workbooks("SubModel Forecast_Other Admin v4.xlsm")
    Set Wk2 = BudWkb.Sheets("By PM")

    fname = "Feb15 PNL"

    'fname = InputBox("Enter PNL File Name")
        Dim Wk4 As Worksheet
        Set Wk4 = BudWkb.Sheets("Validation")

        With Wk4
            Dim CCCol As Long
            Dim fRowCC As Long
            Dim lRowCC As Long
            CCCol = Wk4.Cells.Find("Cost Center", lookat:=xlWhole).Column
            fRowCC = Wk4.Cells.Find("Cost Center", lookat:=xlWhole).Offset(1, 0).row
            lRowCC = Wk4.Cells.Find("Cost Center", lookat:=xlWhole).End(xlDown).row
            Dim CCRg As Range
            Set CCRg = Wk4.Range(Wk4.Cells(fRowCC, CCCol), Wk4.Cells(lRowCC, CCCol))
            'MsgBox (CCRg.Address)

        End With



    Set PNLWkb = Workbooks("Feb15 PNL.xlsx")
    Dim Wk1 As Worksheet
    Set Wk1 = PNLWkb.Sheets("det")

    With Wk1

        If Left(Wk2.Name, 5) = "By PM" Then
            Dim OpsCol As Long
            OpsCol = Wk1.Cells.Find("Property Manager", lookat:=xlWhole).Column
        Else
            OpsCol = Wk1.Cells.Find("Submarket", lookat:=xlWhole).Column
        End If

        Dim FRow As Long
        Dim lRow As Long
        Dim ExpCol As Long
        Dim PropCodeCol As Long


        Dim Expense As String
        Expense = InputBox("Enter Expense GL")

        'to locate begining and ending row of data on PNL report
        'Identifies the column where the SubMarket names are located for lookup purposes
        'Defines the expense GL column to lookup based on the inputbox above
        FRow = Wk1.Cells.Find("66990000", lookat:=xlPart).Offset(2, 0).row
        lRow = Wk1.Cells.Find("66990000", lookat:=xlPart).End(xlDown).Offset(-1, 0).row
        ExpCol = Wk1.Cells.Find(Expense, lookat:=xlPart).Column
        PropCodeCol = Wk1.Cells.Find("Property Code", lookat:=xlWhole).Column


        'Defines the Range of the PM or Sub-Market Names
        Dim OpsRg As Range
        Set OpsRg = Wk1.Range(Wk1.Cells(FRow, OpsCol), Wk1.Cells(lRow, OpsCol))

        'Defines the Range of the Property Codes
        Dim PropCodeRg As Range
        Set PropCodeRg = Wk1.Range(Wk1.Cells(FRow, PropCodeCol), Wk1.Cells(lRow, PropCodeCol))

        'Defines the exact range of the expense column being analyzed
        Dim ExpRg As Range
        Set ExpRg = Wk1.Range(Wk1.Cells(FRow, ExpCol), Wk1.Cells(lRow, ExpCol))

    End With

            Dim AllEntRg As Range
            For Each Cell In OpsRg
              If Cell = "" Then
                  If AllEntRg Is Nothing Then
                      Set AllEntRg = Cells(Cell.row, PropCodeCol)
                  Else
                      Set AllEntRg = Union(AllEntRg, Cells(Cell.row, PropCodeCol))
                  End If
                'End If
              End If
            Next
            MsgBox (AllEntRg.Address)

            'MsgBox (Application.Match(Wk1.Cells(59, 1), CCRg, 0))
            'Dim y
            'y = Application.Match(Wk1.Cells(10, 1), CCRg, 0)
            'If IsError(y) Then
            'MsgBox ("pooopy error")
            'End If


            Dim EntityRg As Range
            'Dim c As Range
            For Each c In AllEntRg
            'Dim z
            'z = Application.Match(c, CCRg, 0)


                    If CCRg.Find(c.Value, lookat:=xlPart) Is Nothing Then
                        If EntityRg Is Nothing Then
                            Set EntityRg = c
                        Else
                            Set EntityRg = Union(EntityRg, c)
                        End If
                    End If
            Next
            MsgBox (EntityRg.Address)

            Dim CostCRg As Range
            Dim r As Range
            For Each r In AllEntRg

                    If Not CCRg.Find(r.Value, lookat:=xlPart) Is Nothing Then
                        If CostCRg Is Nothing Then
                            Set CostCRg = r
                        Else
                            Set CostCRg = Union(CostCRg, r)
                        End If
                    End If
            Next
            MsgBox (CostCRg.Address)

            Dim v As Double
            v = Application.WorksheetFunction.Sum(EntityRg)
            'SendKeys "{F9}"
            MsgBox (v)


Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
托尼·达利摩(Tony Dallimore)

我无法运行您的代码,但已对其进行了检查并注意到一些可能的问题。


lRowCC = Wk4.Cells.Find("Cost Center", lookat:=xlWhole).End(xlDown).row

`.End(xlDown)不是查找列最后一行的可靠方法。阅读我的答案以得到解释:Excel vba – xlDown


您说:“对于EntityRg,定义的range.address与AllEntRg相同(事实并非如此)。”

您是否相信它们是相同的,因为EntityRg.Address = AllEntRg.Address

EntityRg .Address将是由逗号分隔的绝对单元格和范围地址的字符串。您可能不知道此字符串的最大长度约为255。我找不到任何文档,但是根据我自己的实验,该字符串EntityRg .Address将被截断为小于256,从而没有部分单元格或范围地址。

您是否被这些地址匹配的前255个字符所迷惑?

另一种可能性是,每次使用的CCRg.Find(c.Value, lookat:=xlPart)收益Nothing,从而EntityRgAllEntRg相等。CostCRg说错了;是因为是Nothing吗?


您有两个循环在中搜索CCRgAllEntRg一个循环记录成功,一个循环记录失败。为什么不将循环组合成类似以下内容的内容:

If CCRg.Find(c.Value, lookat:=xlPart) Is Nothing Then
  If EntityRg Is Nothing Then
    Set EntityRg = c
   Else
     Set EntityRg = Union(EntityRg, c)
   End If
Else
  If CostCRg Is Nothing Then
    Set CostCRg = r
  Else
    Set CostCRg = Union(CostCRg, r)
 End If
End If

我担心For Each c In AllEntRg没有给您您期望的东西。如果您将范围与结合使用Union,则会整理整齐。因此Union(Range("A2"), Range("A3", Range("A5"), Range("A6"), Range("A7")).Address,“ $ A $ 2:$ A $ 3,$ A $ 5:$ A $ 7”不是“ $ A $ 2,$ A $ 3,$ A $ 5,$ A $ 6,$ A $ 7”。我的回忆是For Each c In AllEntRg不会将“ $ A $ 2:$ A $ 3”拆分为单独的单元格。

F8用来逐步执行此循环,以检查它是否按预期执行。

希望这可以帮助

评论中描述的问题的答案

您的问题是您对Withs的使用不一致,尤其是,您没有标识要操作的工作簿。

Wk4被明确指定为在工作簿内,BufdWkb并且Wk1被指定为在工作簿PNLWkb

但是,在

Set AllEntRg = Cells(Cell.row, PropCodeCol)

您没有为指定工作表或工作簿Cells这相当于

Set AllEntRg = ActiveWorkbook.ActiveSheet.Cells(Cell.row, PropCodeCol)`

您需要编写Set AllEntRg = .Cells(Cell.row, PropCodeCol)(注意单元格之前的句点),并将此代码包含在With Wk1块中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果在列表数组中找到匹配项,则Excel返回另一个单元格值

来自分类Dev

如果在另一个对象数组中找到属性,则映射对象

来自分类Dev

如果在另一个数据框中找到行,则将其删除

来自分类Dev

如果在另一个列表中找到值,则不会将Python列表附加到后面

来自分类Dev

宏以在一个工作簿中搜索单元格,如果找到则填充另一个工作簿中的协调单元格

来自分类Dev

如果在另一个数据框列pandas中找到一列中的值,则返回值

来自分类Dev

使用grep查找文本,如果在文件中找到,则在该文件中回显另一个字符串

来自分类Dev

如果在另一个字符串中找到它们,则用空白替换字符串的字母

来自分类Dev

Excel公式-如果在行中找到值,则返回下一个单元格的值

来自分类Dev

如果在另一个表的其他两个列的范围之间找到一个新列,则该列将填充另一个表中的值

来自分类Dev

如果在上一个查询中找到Laravel,则跳过结果

来自分类Dev

c 字符串:如果在句子中找到一个单词,则输入 ' '

来自分类Dev

引用在另一个子目录(VBA)中找到的工作簿文件路径

来自分类Dev

引用在另一个子目录(VBA)中找到的工作簿文件路径

来自分类Dev

如果在另一行中找到ID,则MySQL删除行

来自分类Dev

使用Pandas在另一个列中找到满足条件的值的范围

来自分类Dev

将单元格范围从一个工作簿工作表复制到另一个工作簿工作表

来自分类Dev

使用Shell脚本检查另一个文件中的编号(如果在范围内)

来自分类Dev

VBA将单元格范围复制到另一个工作簿上的范围

来自分类Dev

如果在另一个单元格中满足某些条件,则在一个单元格中计数

来自分类Dev

calc / excel如果在两个单元格中找到文本并输出文本

来自分类Dev

VBA宏如果在多个单元格中找到该单元格,则

来自分类Dev

VBA Excel-在列中找到一个值,粘贴到另一个工作表

来自分类Dev

双击单元格并找到另一个工作表的值

来自分类Dev

如果在单词1中找到一个字母,并且在单词2中,则从单词2中删除字母

来自分类Dev

Excel VBA 宏 - 找到两列中的单元格与另一个工作簿中的行和列匹配的单元格位置,然后粘贴一个值

来自分类Dev

如果在列中找到重复的单元格值,则返回值

来自分类Dev

如果在另一个表中引用了行,则防止软删除

来自分类Dev

如果在另一个目录中,则404将不会加载图像

Related 相关文章

  1. 1

    如果在列表数组中找到匹配项,则Excel返回另一个单元格值

  2. 2

    如果在另一个对象数组中找到属性,则映射对象

  3. 3

    如果在另一个数据框中找到行,则将其删除

  4. 4

    如果在另一个列表中找到值,则不会将Python列表附加到后面

  5. 5

    宏以在一个工作簿中搜索单元格,如果找到则填充另一个工作簿中的协调单元格

  6. 6

    如果在另一个数据框列pandas中找到一列中的值,则返回值

  7. 7

    使用grep查找文本,如果在文件中找到,则在该文件中回显另一个字符串

  8. 8

    如果在另一个字符串中找到它们,则用空白替换字符串的字母

  9. 9

    Excel公式-如果在行中找到值,则返回下一个单元格的值

  10. 10

    如果在另一个表的其他两个列的范围之间找到一个新列,则该列将填充另一个表中的值

  11. 11

    如果在上一个查询中找到Laravel,则跳过结果

  12. 12

    c 字符串:如果在句子中找到一个单词,则输入 ' '

  13. 13

    引用在另一个子目录(VBA)中找到的工作簿文件路径

  14. 14

    引用在另一个子目录(VBA)中找到的工作簿文件路径

  15. 15

    如果在另一行中找到ID,则MySQL删除行

  16. 16

    使用Pandas在另一个列中找到满足条件的值的范围

  17. 17

    将单元格范围从一个工作簿工作表复制到另一个工作簿工作表

  18. 18

    使用Shell脚本检查另一个文件中的编号(如果在范围内)

  19. 19

    VBA将单元格范围复制到另一个工作簿上的范围

  20. 20

    如果在另一个单元格中满足某些条件,则在一个单元格中计数

  21. 21

    calc / excel如果在两个单元格中找到文本并输出文本

  22. 22

    VBA宏如果在多个单元格中找到该单元格,则

  23. 23

    VBA Excel-在列中找到一个值,粘贴到另一个工作表

  24. 24

    双击单元格并找到另一个工作表的值

  25. 25

    如果在单词1中找到一个字母,并且在单词2中,则从单词2中删除字母

  26. 26

    Excel VBA 宏 - 找到两列中的单元格与另一个工作簿中的行和列匹配的单元格位置,然后粘贴一个值

  27. 27

    如果在列中找到重复的单元格值,则返回值

  28. 28

    如果在另一个表中引用了行,则防止软删除

  29. 29

    如果在另一个目录中,则404将不会加载图像

热门标签

归档