【问题标题】:Macro doesnt work when copy-pasting macro button to different worksheet将宏按钮复制粘贴到不同的工作表时宏不起作用
【发布时间】:2020-04-17 11:15:04
【问题描述】:

我编写了一个名为 GenerateCSV 的函数,它将数据写入 csv 文件。该函数存储在模块(“模块 1”)中。 为了完整起见,我分享了下面的代码,但我认为我的问题没有必要。

Option Explicit

Sub GenerateCSV(ExcelStartRange As String, OutputFileName As String)

'Variable declaration
Dim Data As Variant
Dim MaxRow As Integer
Dim MaxColumn As Integer
Dim Row As Integer
Dim Column As Integer

Open OutputFileName For Output As #1

MaxRow = 2
MaxColumn = 722

For Row = 1 To MaxRow
    For Column = 1 To MaxColumn
        Data = Range(ExcelStartRange).Offset(Row - 1, Column - 1).Value

        If Column < MaxColumn Then
            Write #1, Data,
        Else
            Write #1, Data
        End If
    Next
    Application.StatusBar = "Row = " & Row
Next

Close #1

End Sub

我还在工作表“OutputCFs”中编写了一个调用 GenerateCSV 的宏:

Private Sub CommandButton1_Click()
    Call GenerateCSV(Range("StartRange1"), Range("OutputFileName1"))
    Call GenerateCSV(Range("StartRange3"), Range("OutputFileName3"))

End Sub

当我按下“OutputCFs”中的宏按钮时,它工作正常。但是,当我将宏按钮移动/复制粘贴到不同的工作表(例如“指南”)时,它不再起作用了。

我应该在我的代码中添加什么,以便宏按钮也可以在“指南”工作表中使用。

谢谢。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    问题……

    …是那个在

    GenerateCSV(Range("StartRange1"), Range("OutputFileName1"))
    

    您没有准确指定您的范围在哪个工作表中。因此 Excel 开始猜测您的意思是哪个工作表,有时它会出错。因此,根据哪个是活动工作表或这段代码的确切编写位置,Excel 的猜测程序会发生变化,这会搞砸。

    解决方案

    对于所有 RangeCellsColumnsRows 对象(以及位于工作表中的其他对象)始终在它们是哪个工作簿和工作表,以防止 Excel 猜测和做出假设。

    GenerateCSV ThisWorkbook.Worksheets("OutputCFs").Range("StartRange1"), ThisWorkbook.Worksheets("OutputCFs").Range("OutputFileName1")
    

    这是可靠的,并将确保它始终与此特定工作簿 ThisWorkbook 一起使用,其中包含此特定工作表 Worksheets("OutputCFs")。现在 Excel 没有猜测或做出假设的空间了。 Excel有一个非常明确的声明,它会遵循它。您的代码越精确,Excel 就会越精确。

    强烈建议始终对位于工作表中的所有对象执行此操作,否则您永远不知道何时开始失败。
    如果您有更多代码,请立即检查并正确指定所有工作簿。


    推荐

    如果您在这方面需要一些支持并编写干净可靠的代码,请查看用于 VBA 的 Rubberduck AddIn。如果您有范围但没有指定工作表,它可以自动警告您。它会告诉你

    成员“Range”隐式引用“ActiveSheet”。

    在其代码检查器中。此外,Rubberduck 还附带了许多其他有用的东西。

    【讨论】:

    • 感谢您的详尽解释。已接受答案!
    【解决方案2】:

    一个问题是GenerateCSV() 期望String 作为输入,而您的按钮代码将Range() 对象作为输入。

    编辑#1:

    这可能会导致问题。例如,如果 Range("StartRange1") 的值是 A1,那么按钮代码将假定这意味着 A1 在按钮所在的同一工作表上。

    【讨论】:

    • Range("StartRange1") 默认为Range("StartRange1").Value,如果这是数字,如果GenerateCSV 需要一个,它会自动转换为字符串。试一试。
    • @Pᴇʜ 我担心正在针对错误的工作表评估 Range
    • 嗯,这更有可能,是的。
    • @Gary'sStudent 我已将“OutputCFs”中的宏按钮的相同按钮代码添加到“指南”中的宏按钮中,但添加了“工作表(“OutputCFs”)。”在两个范围的前面(例如 Worksheets("OutputCFs").Range("StartRange3"))。我还将“指南”选项卡中的代码标题从 Private Sub 更改为 Public Sub。我现在确实得到了 csv 文件,但由于某种原因它们只包含逗号..
    • @matthew 您是否也在这里指定了工作表Data = Range(ExcelStartRange)?此外,当您运行此GenerateCSV(Range("StartRange3"), Range("OutputFileName3")) 时,它将使用单元格中的值Range("StartRange3") 作为范围地址Data = Range(ExcelStartRange),这真的是您想要的吗?还是您想要GenerateCSV("StartRange3", "OutputFileName3") 之类的东西?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多