如何将Mac上创建的Excel VBA转换为Windows?

时间:2018-10-26 12:01:35

标签: excel vba

我为Mac上的Excel中的按钮制作了VBA,该按钮应该将几个选定单元格的内容复制到一个选项卡上,并将其(作为值)粘贴到另一个指定行中的第一个可用单元格上标签。

这是我第一次尝试这样做,所以我可能没有做得尽可能高效,但是它可行。

问题在于它仅在Mac上可用。我为PC制作的同事。我可以将代码转换为在PC版Excel上运行吗?

编辑:我应该更明确地了解问题的实质(感谢@KenWhite)。

这就是发生的事情:

  1. 我创建了文件和VBA。
  2. 我保存了文件并将其附加到电子邮件中
  3. 我的同事保存并打开了它
  4. 按下按钮时,出现错误索引集间隔”。为此,我最好的翻译是索引超出范围(但我不确定)

我怀疑这与Mac-> PC有关,但有些人指出应该没有区别。我意识到工作表上的名称和数据必须位于完全相同的位置-但这在这种情况下不应该成为问题。

编辑2:似乎是特殊字符的问题。工作表名称中使用的“ä”和“ö”在末尾的VBA代码中更改为“š”和“¨”。我现在无法对其进行测试,但是我的猜测是,如果我手动更改代码中的字符或确保使用不含特殊字符的工作表名称,则该代码将起作用。

如果我应该/可以添加其他信息,请告诉我,我将进行另一次编辑。

谢谢大家。

Sub Generera()
'
' Generera Makro
'

'
    Range("B1").Select
    Selection.Copy
    Sheets("Utveckling över tid").Select
    BMaxRows = Cells(Rows.Count, "B").End(xlUp).Row
    Range("B" & BMaxRows + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("veckoräckvidd").Select
    Range("B2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Utveckling över tid").Select
    CMaxRows = Cells(Rows.Count, "C").End(xlUp).Row
    Range("C" & CMaxRows + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("veckoräckvidd").Select
    Range("B3").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Utveckling över tid").Select
    DMaxRows = Cells(Rows.Count, "D").End(xlUp).Row
    Range("D" & DMaxRows + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("veckoräckvidd").Select
    Range("B4").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Utveckling över tid").Select
    EMaxRows = Cells(Rows.Count, "E").End(xlUp).Row
    Range("E" & EMaxRows + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("veckoräckvidd").Select
    Range("B6").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Utveckling över tid").Select
    FMaxRows = Cells(Rows.Count, "F").End(xlUp).Row
    Range("F" & FMaxRows + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("veckoräckvidd").Select
    Range("B7").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Utveckling över tid").Select
    GMaxRows = Cells(Rows.Count, "G").End(xlUp).Row
    Range("G" & GMaxRows + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("veckoräckvidd").Select
    Range("B8").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Utveckling över tid").Select
    HMaxRows = Cells(Rows.Count, "H").End(xlUp).Row
    Range("H" & HMaxRows + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("veckoräckvidd").Select
    Range("B9").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("veckoräckvidd").Select
    Range("B11").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Utveckling över tid").Select
    IMaxRows = Cells(Rows.Count, "I").End(xlUp).Row
    Range("I" & IMaxRows + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("veckoräckvidd").Select
    Range("B12").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Utveckling över tid").Select
    JMaxRows = Cells(Rows.Count, "J").End(xlUp).Row
    Range("J" & JMaxRows + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

1 个答案:

答案 0 :(得分:1)

我相信这可以替代您当前的宏,因此可以解决您的问题。

Sub Generera()

    Dim ws1 As Worksheet
    Set ws1 = sheets("Utveckling över tid")

    Dim ws2 As Worksheet
    Set ws2 = sheets("veckoräckvidd")

    Dim i As Long
    For i = 2 To 10
        Dim colLetter As String
        colLetter = Split(Cells(1, i).Address, "$")(1)

        ws1.Range(colLetter & ws1.Cells(rows.count, colLetter).End(xlUp).row + 1).value = ws2.Range("B" & i - 1).value
    Next i

End Sub

以下是我将原始代码转换为较短版本的步骤:

Range("B1").Select
Selection.copy
sheets("Utveckling över tid").Select
BMaxRows = Cells(rows.count, "B").End(xlUp).row
Range("B" & BMaxRows + 1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Stopped using .Select,并开始使用直接Range().value传输而不是.copy.pastespecial,这样我就不必弄乱cutcopymode了,因为您不必做一些特别的事情,只复制值。

BMaxRows = sheets("veckoräckvidd").Cells(rows.count, "B").End(xlUp).row
sheets("veckoräckvidd").Range("B" & BMaxRows + 1).value = _
    sheets("Utveckling över tid").Range("B1").value

为最终简化起见,将BMaxRows的语句包含在范围本身内。

sheets("veckoräckvidd").Range("B" & sheets("veckoräckvidd").Cells(rows.count, "B").End(xlUp).row + 1).value = _
    sheets("Utveckling över tid").Range("B1").value

使用Worksheet变量来缩短每次我需要引用工作表名称之一的时间。

ws2.Range("B" & ws2.Cells(rows.count, "B").End(xlUp).row + 1).value = _
    ws1.Range("B1").value

并将其转换为循环,可以并排比较几个转换后的操作,以查看每个实例的变化。在这种情况下,它是ws2的列字母和ws1中的行号。

ws2.Range("B" & ws2.Cells(rows.count, "B").End(xlUp).row + 1).value = ws1.Range("B1").value
ws2.Range("C" & ws2.Cells(rows.count, "C").End(xlUp).row + 1).value = ws1.Range("B2").value
ws2.Range("D" & ws2.Cells(rows.count, "D").End(xlUp).row + 1).value = ws1.Range("B3").value