已解决 - 请参阅下面的说明,尤其是"编辑3:"
基本问题是:当宏运行时,引用样式会更改(从R1C1到A1)。有什么可以触发这个?在我的工作簿中可能存在某种腐败吗?还有其他可能的解释吗?
更改意味着使用R1C1引用编写的公式然后返回错误,这会导致宏停止运行。一旦我对任何工作表进行任何更改(单击任何空单元格并按Enter键),引用样式将更改回来并且错误消失。
您可以通过转到选项并更改参考样式来重新创建没有宏的效果。这只会在您进行任何更改后影响工作表。
我尝试在不同版本的excel和不同数量的RAM上运行它。所有标准都设置为R1C1。所有在运行宏时切换到A1并返回错误。
我还尝试在宏中重复设置R1C1的引用样式,以抵消发生的任何更改。我试着省略Clear Cache位,因为我之前没有使用它,并且不确定我是否正确使用它。这些都没有纠正这个问题。
下面你会发现有很大差距的代码和由于类型错误而停止运行的注释(因为试图将错误值加载到Double-type变量中)。
edit1:感谢您提供有用的评论。我现在纠正了。
edit2:为了确保我没有处理损坏的文件,我尝试了一个新的工作簿,新的数据副本,新的数据透视表,只复制了宏代码和少量编译的公式枢轴输出到几个关键数字 - 仍然得到相同的结果。
编辑3:我不明白导致问题的原因,但我找到了解决问题的方法。 Excel更改引用类型会使用=cell("address";)
的输出破坏公式,但不能使用=address(;;;0)
来明确声明引用样式。使用两种类型的引用并在两个工作簿中尝试它们,我还发现只有第一组切片器才会出现问题,而对于第二组,两种引用都保持不变。如果有人知道为什么会这样,我仍然感兴趣。在任何情况下,我都会留下这个,以防其他人遇到同样的问题。
Sub ReadWriteFastExport()
Dim Cache As SlicerCache
Dim Item As SlicerItem
Dim hs2name As String
Dim hs4name As String
Dim j, l As Integer
Dim GVolumen As Double, Konzentrationst As Double
Dim GTrend As Double, Konzentration16 As Double, GTrendinP As Double
Dim Top5VolumenWert As Variant, Top5VolumenAnteil As Variant, Top5VolumenName As Variant
Dim Top5TrendName As Variant, Top5TrentWert As Variant, Top5TrendAnteilt As Variant
Dim Flop5TrendName As Variant, Flop5TrendWert As Variant, Flop5TrendAnteilt As Variant
For Each Cache In ActiveWorkbook.SlicerCaches
Cache.ClearManualFilter
Next Cache
Worksheets("ExporteDashboard").Activate
GVolumen = ActiveSheet.Cells(20, 98).Value
GTrend = ActiveSheet.Cells(21, 98).Value
GTrendinP = ActiveSheet.Cells(22, 98).Value
Top5VolumenName = ActiveSheet.Range(Cells(25, 98), Cells(29, 98))
Top5VolumenWert = ActiveSheet.Range(Cells(25, 97), Cells(29, 97))
Top5VolumenAnteil = ActiveSheet.Range(Cells(37, 97), Cells(41, 97))
Top5TrendName = ActiveSheet.Range(Cells(37, 99), Cells(41, 99))
Top5TrendWert = ActiveSheet.Range(Cells(31, 97), Cells(35, 97))
Top5TrendAnteilt = ActiveSheet.Range(Cells(37, 98), Cells(41, 98))
Flop5TrendName = ActiveSheet.Range(Cells(31, 101), Cells(35, 101))
Flop5TrendWert = ActiveSheet.Range(Cells(31, 98), Cells(35, 98))
Flop5TrendAnteilt = ActiveSheet.Range(Cells(43, 98), Cells(47, 98))
Konzentration16 = ActiveSheet.Cells(63, 96).Value
Konzentrationst = ActiveSheet.Cells(65, 96).Value
Worksheets("Global").Activate
ActiveSheet.Cells(1, 1).Value = "Richtung"
ActiveSheet.Range(Cells(2, 1), Cells(51, 1)) = "Export"
ActiveSheet.Cells(1, 2).Value = "Wert"
ActiveSheet.Cells(2, 2).Value = "GVolumen"
ActiveSheet.Cells(3, 2).Value = "GTrend"
ActiveSheet.Cells(4, 2).Value = "GTrendinP"
ActiveSheet.Range(Cells(5, 2), Cells(9, 2)) = "Top5VolumenName"
ActiveSheet.Range(Cells(10, 2), Cells(14, 2)) = "Top5VolumenWert"
ActiveSheet.Range(Cells(15, 2), Cells(19, 2)) = "Top5VolumenAnteil"
ActiveSheet.Range(Cells(20, 2), Cells(24, 2)) = "Top5TrendName"
ActiveSheet.Range(Cells(25, 2), Cells(29, 2)) = "Top5TrendWert"
ActiveSheet.Range(Cells(30, 2), Cells(34, 2)) = "Top5TrendAnteilt"
ActiveSheet.Range(Cells(35, 2), Cells(39, 2)) = "Flop5TrendName"
ActiveSheet.Range(Cells(40, 2), Cells(44, 2)) = "Flop5TrendWert"
ActiveSheet.Range(Cells(45, 2), Cells(49, 2)) = "Flop5TrendAnteilt"
ActiveSheet.Cells(50, 2).Value = "Konzentration16"
ActiveSheet.Cells(51, 2).Value = "Konzentrationstrend"
ActiveSheet.Cells(1, 3).Value = "Global"
ActiveSheet.Cells(2, 3).Value = GVolumen
ActiveSheet.Cells(3, 3).Value = GTrend
ActiveSheet.Cells(4, 3).Value = GTrendinP
ActiveSheet.Range(Cells(5, 3), Cells(9, 3)) = Top5VolumenName
ActiveSheet.Range(Cells(10, 3), Cells(14, 3)) = Top5VolumenWert
ActiveSheet.Range(Cells(15, 3), Cells(19, 3)) = Top5VolumenAnteil
ActiveSheet.Range(Cells(20, 3), Cells(24, 3)) = Top5TrendName
ActiveSheet.Range(Cells(25, 3), Cells(29, 3)) = Top5TrendWert
ActiveSheet.Range(Cells(30, 3), Cells(34, 3)) = Top5TrendAnteilt
ActiveSheet.Range(Cells(35, 3), Cells(39, 3)) = Flop5TrendName
ActiveSheet.Range(Cells(40, 3), Cells(44, 3)) = Flop5TrendWert
ActiveSheet.Range(Cells(45, 3), Cells(49, 3)) = Flop5TrendAnteilt
ActiveSheet.Cells(50, 3).Value = Konzentration16
ActiveSheet.Cells(51, 3).Value = Konzentrationst
hs2name = ThisWorkbook.SlicerCaches("Datenschnitt_HS2").SlicerItems(1).Name
For Each Item In ThisWorkbook.SlicerCaches("Datenschnitt_HS2").SlicerItems
If Item.Name <> ThisWorkbook.SlicerCaches("Datenschnitt_HS2").SlicerItems(1).Name Then
Item.Selected = False
End If
Next Item
Worksheets(hs2name).Activate
ActiveSheet.Cells(1, 1).Value = "Richtung"
ActiveSheet.Range(Cells(2, 1), Cells(51, 1)) = "Export"
ActiveSheet.Cells(1, 2).Value = "Wert"
ActiveSheet.Cells(2, 2).Value = "GVolumen"
ActiveSheet.Cells(3, 2).Value = "GTrend"
ActiveSheet.Cells(4, 2).Value = "GTrendinP"
ActiveSheet.Range(Cells(5, 2), Cells(9, 2)) = "Top5VolumenName"
ActiveSheet.Range(Cells(10, 2), Cells(14, 2)) = "Top5VolumenWert"
ActiveSheet.Range(Cells(15, 2), Cells(19, 2)) = "Top5VolumenAnteil"
ActiveSheet.Range(Cells(20, 2), Cells(24, 2)) = "Top5TrendName"
ActiveSheet.Range(Cells(25, 2), Cells(29, 2)) = "Top5TrendWert"
ActiveSheet.Range(Cells(30, 2), Cells(34, 2)) = "Top5TrendAnteilt"
ActiveSheet.Range(Cells(35, 2), Cells(39, 2)) = "Flop5TrendName"
ActiveSheet.Range(Cells(40, 2), Cells(44, 2)) = "Flop5TrendWert"
ActiveSheet.Range(Cells(45, 2), Cells(49, 2)) = "Flop5TrendAnteilt"
ActiveSheet.Cells(50, 2).Value = "Konzentration16"
ActiveSheet.Cells(51, 2).Value = "Konzentrationstrend"
Worksheets("ExporteDashboard").Activate
'Line at which the macro currently stops
GVolumen = ActiveSheet.Cells(20, 98).Value
GTrend = ActiveSheet.Cells(21, 98).Value
GTrendinP = ActiveSheet.Cells(22, 98).Value
Top5VolumenName = ActiveSheet.Range(Cells(25, 98), Cells(29, 98))
Top5VolumenWert = ActiveSheet.Range(Cells(25, 97), Cells(29, 97))
Top5VolumenAnteil = ActiveSheet.Range(Cells(37, 97), Cells(41, 97))
Top5TrendName = ActiveSheet.Range(Cells(37, 99), Cells(41, 99))
Top5TrendWert = ActiveSheet.Range(Cells(31, 97), Cells(35, 97))
Top5TrendAnteilt = ActiveSheet.Range(Cells(37, 98), Cells(41, 98))
Flop5TrendName = ActiveSheet.Range(Cells(31, 101), Cells(35, 101))
Flop5TrendWert = ActiveSheet.Range(Cells(31, 98), Cells(35, 98))
Flop5TrendAnteilt = ActiveSheet.Range(Cells(43, 98), Cells(47, 98))
Konzentration16 = ActiveSheet.Cells(63, 96).Value
Konzentrationst = ActiveSheet.Cells(65, 96).Value
Worksheets("Global").Activate
ActiveSheet.Cells(1, 4).Value = hs2name
ActiveSheet.Cells(2, 4).Value = GVolumen
ActiveSheet.Cells(3, 4).Value = GTrend
ActiveSheet.Cells(4, 4).Value = GTrendinP
ActiveSheet.Range(Cells(5, 4), Cells(9, 4)) = Top5VolumenName
ActiveSheet.Range(Cells(10, 4), Cells(14, 4)) = Top5VolumenWert
ActiveSheet.Range(Cells(15, 4), Cells(19, 4)) = Top5VolumenAnteil
ActiveSheet.Range(Cells(20, 4), Cells(24, 4)) = Top5TrendName
ActiveSheet.Range(Cells(25, 4), Cells(29, 4)) = Top5TrendWert
ActiveSheet.Range(Cells(30, 4), Cells(34, 4)) = Top5TrendAnteilt
ActiveSheet.Range(Cells(35, 4), Cells(39, 4)) = Flop5TrendName
ActiveSheet.Range(Cells(40, 4), Cells(44, 4)) = Flop5TrendWert
ActiveSheet.Range(Cells(45, 4), Cells(49, 4)) = Flop5TrendAnteilt
ActiveSheet.Cells(50, 4).Value = Konzentration16
ActiveSheet.Cells(51, 4).Value = Konzentrationst
For j = 2 To ThisWorkbook.SlicerCaches("Datenschnitt_HS2").SlicerItems.Count
hs2name = ThisWorkbook.SlicerCaches("Datenschnitt_HS2").SlicerItems(j).Name
ThisWorkbook.SlicerCaches("Datenschnitt_HS2").SlicerItems(j).Selected = True
ThisWorkbook.SlicerCaches("Datenschnitt_HS2").SlicerItems(j - 1).Selected = False
Worksheets(hs2name).Activate
ActiveSheet.Cells(1, 1).Value = "Richtung"
ActiveSheet.Range(Cells(2, 1), Cells(51, 1)) = "Export"
ActiveSheet.Cells(1, 2).Value = "Wert"
ActiveSheet.Cells(2, 2).Value = "GVolumen"
ActiveSheet.Cells(3, 2).Value = "GTrend"
ActiveSheet.Cells(4, 2).Value = "GTrendinP"
ActiveSheet.Range(Cells(5, 2), Cells(9, 2)) = "Top5VolumenName"
ActiveSheet.Range(Cells(10, 2), Cells(14, 2)) = "Top5VolumenWert"
ActiveSheet.Range(Cells(15, 2), Cells(19, 2)) = "Top5VolumenAnteil"
ActiveSheet.Range(Cells(20, 2), Cells(24, 2)) = "Top5TrendName"
ActiveSheet.Range(Cells(25, 2), Cells(29, 2)) = "Top5TrendWert"
ActiveSheet.Range(Cells(30, 2), Cells(34, 2)) = "Top5TrendAnteilt"
ActiveSheet.Range(Cells(35, 2), Cells(39, 2)) = "Flop5TrendName"
ActiveSheet.Range(Cells(40, 2), Cells(44, 2)) = "Flop5TrendWert"
ActiveSheet.Range(Cells(45, 2), Cells(49, 2)) = "Flop5TrendAnteilt"
ActiveSheet.Cells(50, 2).Value = "Konzentration16"
ActiveSheet.Cells(51, 2).Value = "Konzentrationstrend"
Worksheets("ExporteDashboard").Activate
GVolumen = ActiveSheet.Cells(20, 98).Value
GTrend = ActiveSheet.Cells(21, 98).Value
GTrendinP = ActiveSheet.Cells(22, 98).Value
Top5VolumenName = ActiveSheet.Range(Cells(25, 98), Cells(29, 98))
Top5VolumenWert = ActiveSheet.Range(Cells(25, 97), Cells(29, 97))
Top5VolumenAnteil = ActiveSheet.Range(Cells(37, 97), Cells(41, 97))
Top5TrendName = ActiveSheet.Range(Cells(37, 99), Cells(41, 99))
Top5TrendWert = ActiveSheet.Range(Cells(31, 97), Cells(35, 97))
Top5TrendAnteilt = ActiveSheet.Range(Cells(37, 98), Cells(41, 98))
Flop5TrendName = ActiveSheet.Range(Cells(31, 101), Cells(35, 101))
Flop5TrendWert = ActiveSheet.Range(Cells(31, 98), Cells(35, 98))
Flop5TrendAnteilt = ActiveSheet.Range(Cells(43, 98), Cells(47, 98))
Konzentration16 = ActiveSheet.Cells(63, 96).Value
Konzentrationst = ActiveSheet.Cells(65, 96).Value
Worksheets("Global").Activate
ActiveSheet.Cells(1, j + 3).Value = hs2name
ActiveSheet.Cells(2, j + 3).Value = GVolumen
ActiveSheet.Cells(3, j + 3).Value = GTrend
ActiveSheet.Cells(4, j + 3).Value = GTrendinP
ActiveSheet.Range(Cells(5, j + 3), Cells(9, j + 3)) = Top5VolumenName
ActiveSheet.Range(Cells(10, j + 3), Cells(14, j + 3)) = Top5VolumenWert
ActiveSheet.Range(Cells(15, j + 3), Cells(19, j + 3)) = Top5VolumenAnteil
ActiveSheet.Range(Cells(20, j + 3), Cells(24, j + 3)) = Top5TrendName
ActiveSheet.Range(Cells(25, j + 3), Cells(29, j + 3)) = Top5TrendWert
ActiveSheet.Range(Cells(30, j + 3), Cells(34, j + 3)) = Top5TrendAnteilt
ActiveSheet.Range(Cells(35, j + 3), Cells(39, j + 3)) = Flop5TrendName
ActiveSheet.Range(Cells(40, j + 3), Cells(44, j + 3)) = Flop5TrendWert
ActiveSheet.Range(Cells(45, j + 3), Cells(49, j + 3)) = Flop5TrendAnteilt
ActiveSheet.Cells(50, j + 3).Value = Konzentration16
ActiveSheet.Cells(51, j + 3).Value = Konzentrationst
Next j
For Each Cache In ActiveWorkbook.SlicerCaches
Cache.ClearManualFilter
Next Cache
hs4name = ThisWorkbook.SlicerCaches("Datenschnitt_HS4").SlicerItems(1).Name
hs2name = Left(hs4name, 2)
For Each Item In ThisWorkbook.SlicerCaches("Datenschnitt_HS4").SlicerItems
If Item.Name <> ThisWorkbook.SlicerCaches("Datenschnitt_HS4").SlicerItems(1).Name Then
Item.Selected = False
End If
Next Item
Worksheets("ExporteDashboard").Activate
GVolumen = ActiveSheet.Cells(20, 98).Value
GTrend = ActiveSheet.Cells(21, 98).Value
GTrendinP = ActiveSheet.Cells(22, 98).Value
Top5VolumenName = ActiveSheet.Range(Cells(25, 98), Cells(29, 98))
Top5VolumenWert = ActiveSheet.Range(Cells(25, 97), Cells(29, 97))
Top5VolumenAnteil = ActiveSheet.Range(Cells(37, 97), Cells(41, 97))
Top5TrendName = ActiveSheet.Range(Cells(37, 99), Cells(41, 99))
Top5TrendWert = ActiveSheet.Range(Cells(31, 97), Cells(35, 97))
Top5TrendAnteilt = ActiveSheet.Range(Cells(37, 98), Cells(41, 98))
Flop5TrendName = ActiveSheet.Range(Cells(31, 101), Cells(35, 101))
Flop5TrendWert = ActiveSheet.Range(Cells(31, 98), Cells(35, 98))
Flop5TrendAnteilt = ActiveSheet.Range(Cells(43, 98), Cells(47, 98))
Konzentration16 = ActiveSheet.Cells(63, 96).Value
Konzentrationst = ActiveSheet.Cells(65, 96).Value
Worksheets(hs2name).Activate
ActiveSheet.Cells(1, 4).Value = ThisWorkbook.SlicerCaches("Datenschnitt_HS4").SlicerItems(k).Name
ActiveSheet.Cells(2, 4).Value = GVolumen
ActiveSheet.Cells(3, 4).Value = GTrend
ActiveSheet.Cells(4, 4).Value = GTrendinP
ActiveSheet.Range(Cells(5, 4), Cells(9, 4)) = Top5VolumenName
ActiveSheet.Range(Cells(10, 4), Cells(14, 4)) = Top5VolumenWert
ActiveSheet.Range(Cells(15, 4), Cells(19, 4)) = Top5VolumenAnteil
ActiveSheet.Range(Cells(20, 4), Cells(24, 4)) = Top5TrendName
ActiveSheet.Range(Cells(25, 4), Cells(29, 4)) = Top5TrendWert
ActiveSheet.Range(Cells(30, 4), Cells(34, 4)) = Top5TrendAnteilt
ActiveSheet.Range(Cells(35, 4), Cells(39, 4)) = Flop5TrendName
ActiveSheet.Range(Cells(40, 4), Cells(44, 4)) = Flop5TrendWert
ActiveSheet.Range(Cells(45, 4), Cells(49, 4)) = Flop5TrendAnteilt
ActiveSheet.Cells(50, 4).Value = Konzentration16
ActiveSheet.Cells(51, 4).Value = Konzentrationst
hs2name = "empty"
For j = 2 To ThisWorkbook.SlicerCaches("Datenschnitt_HS4").SlicerItems.Count
ThisWorkbook.SlicerCaches("Datenschnitt_HS4").SlicerItems(j).Selected = True
ThisWorkbook.SlicerCaches("Datenschnitt_HS4").SlicerItems(j - 1).Selected = False
hs4name = ThisWorkbook.SlicerCaches("Datenschnitt_HS4").SlicerItems(j).Name
If Left(hs4name, 2) <> hs2name Then
l = 2
hs2name = Left(hs4name, 2)
Else
l = l + 1
End If
Worksheets("ExporteDashboard").Activate
GVolumen = ActiveSheet.Cells(20, 98).Value
GTrend = ActiveSheet.Cells(21, 98).Value
GTrendinP = ActiveSheet.Cells(22, 98).Value
Top5VolumenName = ActiveSheet.Range(Cells(25, 98), Cells(29, 98))
Top5VolumenWert = ActiveSheet.Range(Cells(25, 97), Cells(29, 97))
Top5VolumenAnteil = ActiveSheet.Range(Cells(37, 97), Cells(41, 97))
Top5TrendName = ActiveSheet.Range(Cells(37, 99), Cells(41, 99))
Top5TrendWert = ActiveSheet.Range(Cells(31, 97), Cells(35, 97))
Top5TrendAnteilt = ActiveSheet.Range(Cells(37, 98), Cells(41, 98))
Flop5TrendName = ActiveSheet.Range(Cells(31, 101), Cells(35, 101))
Flop5TrendWert = ActiveSheet.Range(Cells(31, 98), Cells(35, 98))
Flop5TrendAnteilt = ActiveSheet.Range(Cells(43, 98), Cells(47, 98))
Konzentration16 = ActiveSheet.Cells(63, 96).Value
Konzentrationst = ActiveSheet.Cells(65, 96).Value
Worksheets(hs2name).Activate
ActiveSheet.Cells(1, l + 3).Value = ThisWorkbook.SlicerCaches("Datenschnitt_HS4").SlicerItems(k).Name
ActiveSheet.Cells(2, l + 3).Value = GVolumen
ActiveSheet.Cells(3, l + 3).Value = GTrend
ActiveSheet.Cells(4, l + 3).Value = GTrendinP
ActiveSheet.Range(Cells(5, l + 3), Cells(9, l + 3)) = Top5VolumenName
ActiveSheet.Range(Cells(10, l + 3), Cells(14, l + 3)) = Top5VolumenWert
ActiveSheet.Range(Cells(15, l + 3), Cells(19, l + 3)) = Top5VolumenAnteil
ActiveSheet.Range(Cells(20, l + 3), Cells(24, l + 3)) = Top5TrendName
ActiveSheet.Range(Cells(25, l + 3), Cells(29, l + 3)) = Top5TrendWert
ActiveSheet.Range(Cells(30, l + 3), Cells(34, l + 3)) = Top5TrendAnteilt
ActiveSheet.Range(Cells(35, l + 3), Cells(39, l + 3)) = Flop5TrendName
ActiveSheet.Range(Cells(40, l + 3), Cells(44, l + 3)) = Flop5TrendWert
ActiveSheet.Range(Cells(45, l + 3), Cells(49, l + 3)) = Flop5TrendAnteilt
ActiveSheet.Cells(50, l + 3).Value = Konzentration16
ActiveSheet.Cells(51, l + 3).Value = Konzentrationst
Next j
For Each Cache In ActiveWorkbook.SlicerCaches
Cache.ClearManualFilter
Next Cache
End Sub