我为Mac上的Excel中的按钮制作了VBA,该按钮应该将几个选定单元格的内容复制到一个选项卡上,并将其(作为值)粘贴到另一个指定行中的第一个可用单元格上标签。
这是我第一次尝试这样做,所以我可能没有做得尽可能高效,但是它可行。
问题在于它仅在Mac上可用。我为PC制作的同事。我可以将代码转换为在PC版Excel上运行吗?
编辑:我应该更明确地了解问题的实质(感谢@KenWhite)。
这就是发生的事情:
我怀疑这与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
答案 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