Excel Range对象因为长度超过255个字符的字符串而引发错误0x800A03EC

时间:2016-05-09 09:35:22

标签: excel matlab excel-vba vba

使用MATLAB中的ActiveX服务器,我试图一次突出显示Excel工作表中的许多单元格。这些不在特定列或行中,因此我使用Range('A1,B2,...')来访问它们。但是,Range对象接受的字符串必须少于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;

我该如何解决这个问题?我没有找到调用Range的其他相关方法,或者没有找到我想要修改的单元格。

2 个答案:

答案 0 :(得分:0)

如果您从0开始,则可以测试其长度以确定String是否可以处理它。以下是构建对角线范围的示例:

Range()

对于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,则将使用数组方法。

答案 1 :(得分:0)

正如Rory指出的那样,解决方案是使用Union方法。为了最大限度地减少从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

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