- ベストアンサー
セルに、見えない"何か"が入って困っています
EXCEL VBA(VB6.0)の質問です。結構長いプログラムなので、どの辺りに原因があるのか自分でもよくわからないのですが、シートの内容(値)を入れた2次元配列(myCELLSARRAY)の内容をそのまま実際のセルへ書き込む下記のステートメントがあります。 For i = LBound(myCELLSARRAY, 1) To UBound(myCELLSARRAY, 1) For j = LBound(myCELLSARRAY, 2) To UBound(myCELLSARRAY, 2) Cells(i,j).Value = myCELLSARRAY(i, j) Next j Next i この部分を、myCELLSARRAYの内容を編集する2つのプログラムの実行後にシートに反映するために使っているのですが、2つのプログラムのうち片方のプログラムの後に使った時にのみ、空セルの部分に見えない"何か"が入っているようで困っています。 例えば、上記ステートメント実行後(A,1)に、A列の幅に収まらない文字数の文章が入ったとします。(A,2)から右側のセルに何も入っていなければA,1の内容がA,2やA,3の上にも続けて表示されるのですが、片方のプログラムから呼び出した時にはA,1の文字列はA,2部分にはみ出さず、A,1に収まらない部分は表示されません。 そして、この場合にカーソルをA,2に合わせてからDeleteキーを押すと、見えない"何か"が消えるようで、A,2上にもはみ出して表示されるようになります。 ちなみに上記ステートメントの実行直前または実行中にローカルウィンドウでmyCELLSARRAYの値を確認しても、どちらのプログラムで使った後も空白セルとなる部分の値は同じく何も入っていないようです。(どちらも値は""と表示されます) 両方のプログラムから上記ステートメントを実行した結果のシートをそれぞれCSV形式で保存し、セルの値を確認しましたがどちらも何も入っていません。 この原因は何でしょうか、または、上記ステートメントで、この"何か"が入らないようにするような方法があればアドバイスお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
回避方法から 代入する前にLen関数で文字列長のチェックを行い、0なら代入しなければいいと思います。 if len(myCELLSARRAY(i, j))>0 then Cells(i,j).Value = myCELLSARRAY(i, j) end if シート操作は結構コストの大きい処理なので、パフォーマンスも気持ち向上するかもしれません。 で、原因 似たような経験はあります。 たぶんDeleteをしなくても、上の例でいうA2にセルをあわせ、F2→Enter(編集して何もしないで次を表示)でも同じ結果になるんじゃないかと思います。 よくわからないのですが、プログラムから実行したときは「代入したかしなかったか」のみを判断して、書式の自動判断を自動的に行わない場合があるようなのです。(今思いついたのがScreenupdatingの関係かな?) 確かにいちいち判断をしているとパフォーマンスの低下はかなりのものになるはずなので…。 なので、上記回避方法でいけるのならそれが一番いいかと思います。
その他の回答 (1)
- hotosys
- ベストアンサー率67% (97/143)
空白が入ってませんか? Cells(i, j).Value = myCELLSARRAY(i, j) を Cells(i, j).Value = Trim(myCELLSARRAY(i, j)) に変えてみてどうなりますか? または、Next iの終了時点では正しくて、その後に何らかのセル代入がありませんか? この場合はNext iの後にブレークポイントを入れて、シートを確認するとわかります。 また、見えない何かが数式の場合は、値が""でもはみ出した部分が消えると思いますが、数式が入ってませんか?
補足
ご回答ありがとうございます。セルA1のはみ出した部分がセルA2にはみ出す場合とはみ出さない場合共にA2の中身には何も入っていないように見えます。スペースは入っていません。 Trim(myCELLSARRAY(i, j)) を試してみましたが、結果は同じでした。片方のプログラムで作ったmyCELLSARRAYをシートに書き出した場合にのみA2に文字がはみ出さないようになります。 Next j,Next iの両方でブレークポイントを設定し、一回ずつセルの内容を確認しましたが、この処理の部分で"何か"がセルに入れられているようです。 上記のステートメントで処理しているデータの内容は文章です。(改行は含まない)スペースが含まれる可能性はありますが式が入る事はありません。どうかお知恵をお貸しください。
お礼
ご回答ありがとうございます。 まさにその通りの回避方法で解決しました。 書式の自動判断を行う場合と行わない場合の判断基準がMSから公開されていないとの事で、上記ステートメント実行直前に使う2つのプログラムの違いが、その自動判断を行ったり行わなかったりの違う処理をされ、違う結果になっていたようですね。 VBAのバグなのか原因はよくわかりませんが、おかげさまでプログラムの方はうまく修正する事ができました。ありがとうございました。