2013-06-27 198 views
1

我的代码是运行时错误

Sub PieMarkers() 

Dim chtMarker As Chart 
Dim chtMain As Chart 
Dim intPoint As Integer 
Dim rngRow As Range 
Dim lngPointIndex As Long 
Dim thmColor As Long 
Dim myTheme As String 


Application.ScreenUpdating = False 
Set chtMarker = ActiveSheet.ChartObjects("chtMarker").Chart 
Set chtMain = ActiveSheet.ChartObjects("chtMain").Chart 

Set chtMain = ActiveSheet.ChartObjects("chtMain").Chart 
Set rngRow = Range(ThisWorkbook.Names("PieChartValues").RefersTo) 

For Each rngRow In Range("PieChartValues").Rows 
    chtMarker.SeriesCollection(1).Values = rngRow 
    ThisWorkbook.Theme.ThemeColorScheme.Load GetColorScheme(thmColor) 
    chtMarker.Parent.CopyPicture xlScreen, xlPicture 
    lngPointIndex = lngPointIndex + 1 
    chtMain.SeriesCollection(1).Points(lngPointIndex).Paste 
    thmColor = thmColor + 1 
Next 

lngPointIndex = 0 

Application.ScreenUpdating = True 
End Sub 

Function GetColorScheme(i As Long) As String 
Const thmColor1 As String = "C:\Program Files\Microsoft Office\Document Themes 15\Theme Colors\Blue Green.xml" 
Const thmColor2 As String = "C:\Program Files\Microsoft Office\Document Themes 15\Theme Colors\Orange Red.xml" 
    Select Case i 
     Case 0 
      GetColorScheme = thmColor1 
     Case 1 
      GetColorScheme = thmColor2 
    End Select 
End Function 

代码是指,以改变被用作气泡图中气泡连续饼图的颜色主题。所以这个函数只是为了选择一个我以前保存为字符串的颜色方案,然后根据脚本的运行情况对其进行更改,以便第一个饼图具有比下一个饼图更多的颜色.... 在该行

ThisWorkbook.Theme.ThemeColorScheme.Load GetColorScheme(thmColor) 

调试代码时出错消息运行时错误2147024809话说指示值超出range..can任何人帮我这似乎是这里的问题得到错误信息?

+0

我已经提供了回答OP的原始问题的代码,这是一个重复的问题,我目前正在回答关于@Timon遇到的错误的查询。当函数GetColorScheme接收到一个不是“0”或“1”的“i”值时,会引发此错误。该函数将返回错误提示错误。我已经提供了一些关于如何在原始线程中针对两种以上的情况更新此代码的信息。 –

回答

1

正如我在原始线程的评论中提到的...

using VBA for a pie bubble chart in excel

导致此小家畜的IME错误

有两个可能导致此错误显而易见的事情:

  • 宏&功能目前设置为使用只有两种配色方案,因此,如果您尝试调用此功能的第三次或更多,你会得到这个错误。如果您通过的thmColor索引值不是01,则函数将返回False而不是有效的字符串。
  • 如果返回的字符串值为而非是用户计算机上安装的主题的有效路径&文件名,则该宏也将失败。仔细检查您是否为函数内的thmColor1thmColor2变量提供了有效的文件路径。

原始答案已更新,以允许在两种指定配色方案之间旋转。使用MOD功能在Select Case声明,正是如此:

Function GetColorScheme(i as Long) as String '## Returns the path of a color scheme to load 
    '## Currently set up to ROTATE between only two color schemes. 
    ' You can add more, but you will also need to change the 
    ' Select Case i Mod 2, to i Mod n; where n = the number 
    ' of schemes you will rotate through. 
    Const thmColor1 as String = "C:\Program Files (x86)\Microsoft Office\Document Themes 14\Theme Colors\Apex.xml" 
    Const thmColor2 as String = "C:\Program Files (x86)\Microsoft Office\Document Themes 14\Theme Colors\Essential.xml" 


    Select Case i Mod 2 '## i Mod n; where n = the number of Color Schemes. 
     case 0 
      GetColorScheme = thmColor1 
     case 1 
      GetColorScheme = thmColor2 
     'Case n '## You should have an additional case for each 1 to n. 
     ' 
    End Select 
End Function 

对于其它颜色,则需要初始化表示附加主题文件的其他变量,并相应修改Select Case块。你可能比这更复杂,但不知道你需要应用多少这些,我提供了一个可行的,可扩展的解决方案。如果你有很多图表并想循环使用可用的主题,这也可以完成。变化多么复杂取决于你想要多少变化,但你可以想象的声明一个数组并捕获所有在主题文件夹中安装的主题,并且只是循序遍历那些。

+1

是的,大卫你在这里发现了,我错过了增加'thmColor'的循环,所以一旦它碰到'2',函数将返回一个空字符串,如果你运行'ThisWorkbook.Theme.ThemeColorScheme.Load'''将给你错了。 +1 – CuberChase

+0

@TimonHeinomann请考虑将此标记为**接受的**答案,并标记我之前接受的另一个问题的答案。这就是这个网站的工作原理,当其他人帮助你解决问题的时候,我会在今天晚些时候看看另一个问题。 –

1

如果这是您自己创建的自定义主题(我还没有安装2013,但2007或2010都没有蓝绿或橘红色主题),我会建议您的问题与您的XML文件。

我相信你的thmColor变量将被初始化为零,因为数字在VBA中,如果我将XML文件的路径替换为微软的一个,你的代码对我来说工作正常。 (尽管总是选择thmColor1。)

此外,如果我在其中一个文件中损坏了XML,我会收到一个错误“运行时错误”-2147024809(80070057)由于内容问题导致文件无法打开' 。因为你得到的错误数量超出范围值,我猜你已经错误地定义了一个错误的十六进制值的颜色