2016-05-09 11 views
1

MATLABのActiveXサーバーを使用して、Excelシートの多くのセルを一度に強調表示しようとしています。これらは特定の列や行にありませんので、私はRange('A1,B2,...')を使ってアクセスします。ただし、Rangeオブジェクトで受け入れられる文字列は255文字未満である必要があります。エラー:255文字より長い文字列のため、Excel Rangeオブジェクトでエラー0x800A03ECがスローされる

Error: Object returned error code: 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

Excelのスプレッドシートで書式設定マクロを呼び出すことは可能でしょうか? –

+0

あなたの質問で構文の強調表示を修正しましたが、そこにルージュのアポストロフィがあるようです。 –

+2

Excelのアプリケーションの「Union」メソッドを使用して複数の範囲を結合する必要があります。 – Rory

答えて

0

解決策は、ローリーが指摘したように、Unionメソッドを使用することです。 ActiveXサーバーへのMATLABからの呼び出しの数を最小限に抑えるために、これは私がやったことです:

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 

私は、セルの名前は私のために十分である、長い6文字までであることを考慮してmod250を使用しました。

0

Stringで始まる場合は、その長さをテストしてRange()が処理できるかどうかを判断できます。ここで対角の範囲を構築する例である:i = 10について

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=100た場合、アレイ法が使用されるであろう。

+0

私はActiveXサーバ経由でExcelのインターフェイスを呼び出すMATLABで作業しています。これは、私がRoryの提案に従ったのと同様です。 – buzjwa

関連する問題