由于超过255个字符的string,Excel范围对象会引发错误0x800A03EC

使用来自MATLAB的ActiveX服务器,我试图一次高亮显示Excel工作表中的许多单元格。 这些不在特定的列或行中,所以我使用Range('A1,B2,...')来访问它们。 但是,由Range对象接受的string必须less于255个字符或一个错误:

错误:对象返回的错误代码:0x800A03EC

被抛出。 以下代码用空的Excel文件重现此错误。

 hActX = actxserver('Excel.Application'); hWB = hActX.Workbooks.Open('C:\Book1.xlsx'); hSheet = hWB.Worksheets.Item('Sheet1'); col = repmat('A', 100, 1); row = num2str((1:100)'); %' cellInd = strcat(col, strtrim(cellstr(row))); str1 = strjoin(cellInd(1:66), ','); %// 254 characters str2 = strjoin(cellInd(1:67), ','); %// 258 characters hSheet.Range(str1).Interior.Color = 255; %// Works hSheet.Range(str2).Interior.Color = 255; %// Error 0x800A03EC hWB.Save; hWB.Close(false); hActX.Quit; 

我怎样才能解决这个问题? 我发现没有其他相关的方法调用范围,否则获取我想要修改的单元格。

如果以String开头,则可以testing其长度以确定Range()可以处理它。 这是一个build立对angular线范围的例子:

 Sub DiagonalRange() Dim BigString As String, BigRange As Range Dim i As Long, HowMany As Long, Ln As String HowMany = 100 For i = 1 To HowMany BigString = BigString & "," & Cells(i, i).Address(0, 0) Next i BigString = Mid(BigString, 2) Ln = Len(BigString) MsgBox Ln If Ln < 250 Then Set BigRange = Range(BigString) Else Set BigRange = Nothing arr = Split(BigString, ",") For Each a In arr If BigRange Is Nothing Then Set BigRange = Range(a) Else Set BigRange = Union(BigRange, Range(a)) End If Next a End If BigRange.Select End Sub 

对于i = 10 ,代码将是直接方法,但是如果代码是i=100 ,则将使用数组方法。

正如Rory指出的那样,解决scheme是使用Union方法。 为了最大限度地减less从MATLAB到ActiveX服务器的调用次数,这就是我所做的:

 str = strjoin(cellInd, ','); isep = find(str == ','); isplit = diff(mod(isep, 250)) < 0; isplit = [isep(isplit) (length(str) + 1)]; hRange = hSheet.Range(str(1:(isplit(1) - 1))); for ii = 2:numel(isplit) hRange = hActX.Union(hRange, ... hSheet.Range(str((isplit(ii-1) + 1):(isplit(ii) - 1)))); end 

我在mod使用了250来说明长达6个字符的单元名称,这对我来说已经足够了。