![Excel 宏帮助](https://linux22.com/image/1434525/Excel%20%E5%AE%8F%E5%B8%AE%E5%8A%A9.png)
我的公司使用 Excel 来跟踪便携式灭火器的检查和维护,我正在尝试为其添加一些功能,但不知道该怎么做。我会尽力解释我需要哪些帮助:
所有三张工作表的第 1 行都具有相同的列标题。在工作簿的第一张和第二张工作表(标题分别为“每月”和“每年”)上,我使用条件格式根据公式确定的值为 Y 列和 AC 列中的单元格着色(如果计算返回的值小于 90,则为黄色;如果返回的值为 0 或负数,则为红色)。
我希望宏能将整行从 A 列到 AD 列复制到第三张工作表(标题为“维护到期”)。如果此过程可以自动化,那么就太好了,这样只要“每月”或“每年”工作表中 Y 列和 AC 列的值发生变化,“维护到期”工作表中的信息就会自动更新(但如果我必须手动重新运行宏才能实现这一点,那也没什么大不了的)。
希望我已经以一种让别人理解的方式解释了我正在做的事情,并且他们可以提供帮助。我的编码经验很少,而且我已经 15 年没有真正做过任何编码了,所以我很生疏。我很感激大家能提供的任何建议或帮助。!
编辑:
我从未使用过宏录制器,我只能弄清楚如何创建宏来复制和粘贴,所以我没有运气。经过更多的搜索和观看一些视频后,我拼凑了以下内容:
Sub Show_on_Maint()
x = 2
'Sets the starting row
Do While Cells(x, 2) <> ""
'Continue to evaluate until a blank cell is reached
If Cells(x, 25) <= 90 Then
'Evaluates the cell in column Y to determine if the value is less than or equal to 90
Sheets("Sheet1").Rows(x).Copy Sheets("Sheet6").Range("A2")
'Copies the row to the Maint Due sheet
Else
If Cells(x, 29) <= 90 Then
'Evaluates the cell in column AC to determine if the value is less than or equal to 90
Sheets("Sheet1").Rows(x).Copy Sheets("Sheet6").Range("A2")
'Copies the row to the Maint Due sheet
End If
End If
x = x + 1
Loop
End Sub
当我运行/调试它时,我得到了一个 Loop without Do 错误。我认为我的逻辑是正确的,但我没有足够的经验来弄清楚为什么我会得到这个错误。
编辑:x = x + 1 之前缺少 End If
现在我收到运行时错误 9“下标超出范围”:
Sheets("Sheet1").Rows(x).Copy Sheets("Sheet6").Range("A2")
答案1
你曾提到你希望自动地将信息复制到维护到期,所以我将使用它。Worksheet
更改事件宏可以涵盖自动化,但您需要为每个每月和年度的工作表。我建议Workbook_SheetChange
解析源工作表以查找“每月”或“每年”。
点击Alt+ F11,当 VBE 打开时,查看项目浏览器在左侧本工作簿. 如果你没有项目浏览器打开点击Ctrl+R即可显示。右键单击本工作簿并选择View Code
。在右侧的新窗格中,标题为Book1-ThisWorkbook(代码)粘贴以下内容。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If LCase(Sh.Name) = "monthly" Or LCase(Sh.Name) = "annual" Then
If Not Intersect(Target, Sh.Range("Y:Y, AC:AC")) Is Nothing Then
On Error GoTo Fìn
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim lc As Long, r As Range
For Each r In Intersect(Target, Sh.Range("Y:Y, AC:AC"))
If r.Value <= 90 Then
lc = Sh.Cells(1, Columns.Count).End(xlToLeft).Column
Sh.Cells(r.Row, 1).Resize(1, lc).Copy _
Destination:=Sheets("Maint Due").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
End If
Next r
End If
End If
Fìn:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
点击Alt+Q返回工作簿。在年度或月度工作表的 Y 列或 AC 列中输入任何新值都会导致该行被复制到维护到期工作表中的下一个空白行。
我发现的第一个问题是,触发事件宏不会在公式结果发生变化时触发。有人提到 Y 列和 AC 列正在计算,因此触发器可能必须位于在 Y 列和 AC 列中创建值的列上,而不是 Y 列和 Ac 列本身。V 列和 X 列似乎是可能的候选者。