使用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的其他相关方法,或者没有找到我想要修改的单元格。
答案 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个字符的单元格名称,这对我来说已经足够了。