Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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
Excel 范围宏不起作用_Excel_Vba_Range_Match - Fatal编程技术网

Excel 范围宏不起作用

Excel 范围宏不起作用,excel,vba,range,match,Excel,Vba,Range,Match,以下宏(CollectProjectItems)的功能与设计相同。在宏(CollectContractorItems)中应用相同的逻辑(范围发生变化)无法按预期运行 我想这个错误是我忽略了的,当然。。。为了我的生命。。。我无法识别我的错误 需要一双新眼睛 提前谢谢你 Sub UpdateCharts() CollectProjectItems CollectContractorItems End Sub Sub CollectProjectItems() On Error Re

以下宏(CollectProjectItems)的功能与设计相同。在宏(CollectContractorItems)中应用相同的逻辑(范围发生变化)无法按预期运行

我想这个错误是我忽略了的,当然。。。为了我的生命。。。我无法识别我的错误

需要一双新眼睛

提前谢谢你

Sub UpdateCharts()
    CollectProjectItems
    CollectContractorItems
End Sub

Sub CollectProjectItems()
On Error Resume Next
    MyDate = Format(Date, "mmm") & "-" & Right(Year(Date), 2)
    For Each cl In Range("A3", Range("A" & Rows.Count).End(xlUp))
        wproj = Application.Match(cl.Value, Columns(10), 0)
        
        If IsNumeric(wproj) Then
            MyMonth = Application.Match(MyDate, Rows(wproj + 1), 0)
            Cells(wproj + 2, MyMonth) = cl.Offset(, 1)
            Cells(wproj + 3, MyMonth) = cl.Offset(, 2)
        End If
    Next
End Sub

Sub CollectContractorItems()
On Error Resume Next
    MyDate = Format(Date, "mmm") & "-" & Right(Year(Date), 2)
    For Each cl In Range("E3", Range("E" & Rows.Count).End(xlUp))
        wproj = Application.Match(cl.Value, Columns(25), 0)
        
        If IsNumeric(wproj) Then
            MyMonth = Application.Match(MyDate, Rows(wproj + 1), 0)
            Cells(wproj + 2, MyMonth) = cl.Offset(, 1)
            Cells(wproj + 3, MyMonth) = cl.Offset(, 2)
        End If
    Next
End Sub
第二个宏未完成Col AG中所需的编辑。它复制与列R的第一个宏相同的编辑

我不明白如何更改第二个宏,使其影响Cols Z:AK中的编辑

下载示例工作簿:

如下所示:

子集合合同项()
Const COL_承包商,长度=25
将MyDate设置为字符串、cl设置为范围、ws设置为工作表、wproj、MyMonth
Dim rngDates作为范围,dtCol作为长度
设置ws=ActiveSheet'或某些特定的工作表
MyDate=格式(日期,“mmm”)和“-”及右侧(年份(日期),2)
对于ws.Range(“E3:E”和ws.Cells(ws.Rows.Count,“E”)中的每个cl.End(xlUp.Row).Cells
wproj=Application.Match(cl.Value,ws.Columns(COL_CONTRACTORS),0)
如果不是IsError(wproj),则
'获取日期范围
设置rngDates=ws.Cells(wproj,COL_)。偏移量(1,1)。调整大小(1,12)
MyMonth=Application.Match(MyDate,rngDates,0)'仅在特定范围内搜索
如果不是IsError(我的月份),则
dtCol=rngDates.Cells(MyMonth).Column'获取列号
ws.Cells(wproj+2,dtCol)=cl.Offset(,1)
ws.Cells(wproj+3,dtCol)=cl.Offset(,2)
如果结束
如果结束
下一个
端接头

如果需要了解发生了什么,请删除“下一步继续”中的错误。这是一种很糟糕的“代码气味”——没有理由存在。您还需要使用iError()测试
MyMonth
,以确保找到匹配项。并使用显式工作表对象限定所有范围调用。删除“on Error…”后,我不理解您的第二个建议。
Match()
如果不匹配,将返回一个错误,因此您应该始终使用IsError()测试该错误,以便您可以决定在这种情况下执行什么操作。像
Cells()
(在常规代码模块中)这样的范围引用始终默认为ActiveSheet,并且依赖于某个工作表处于活动状态的代码很容易意外失败。即使您真的想在ActiveSheet上操作,最好在代码中明确说明这一点。所以
ActiveSheet.Cells()
而不仅仅是
Cells()
我理解并感谢你。但是,它仍然不会更改Cols Z:AK中的值。它正在更改不是目标的Cols K:V的值。在这种情况下,MyMonth的值不是您期望的值。我无法预测。。。你需要一步一步地检查代码,看看哪里出了问题……为什么相同的代码会像Cols K:V所期望的那样工作。。。。但它不适合科尔斯Z:AK?如果我正确理解宏逻辑。。。指示ws.Columns(25)应该告诉Excel查看第二组列。
Application.Match(MyDate,ws.Rows(wproj+1),0)
将在该行中找到(例如“Jan-20”的第一个匹配项。因为在同一行中有一组K:V中的月-年值,所以在找到Z:AK中的任何值之前,它会先找到这些值。。。您的“项目”和“分包商”日历不能在同一行上。嗯。。。在这种情况下,我似乎需要研究另一种方法,以便在第二组月份中获得正确的列。