由于超过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个字符的单元名称,这对我来说已经足够了。