★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0054:【番外】20年以上・ほぼ・説明してもらえない、「セル内に余計な改行がある場合のバグ」について01
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0054
タイトル:【番外】20年以上・ほぼ・説明してもらえない、
「セル内に余計な改行がある場合のバグ」について01
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
あけましておめでとうございます。
サボりにサボってかなり久しぶりですが、本年も宜しくお願い致します。
今日から数回、
先日自分の仕事で判明した、『 20年以上、「恐らく仕様と言い張ってる」Excelのバグ 』、
についてお話していこうと思います。
そのバグとは、
「文字列型のセルデータに余計な改行が入っていると、
VBAでの転記(=代入)処理などで、転記先セルの行高が異常に広がってしまう。
転記元のセルでも、F2+Enter操作などで同じようになってしまう。
そして、しかしながら、原因が、”余計な改行だ ”と気付きにくい・・・。」、
というバグです。
基本、転記先のセルで上図の右側のようになるわけですが、
特に問題なのは、
「行高の設定数値によっては、異常な表示状態が複数パターンあって ”一定ではない ”」、
というところです。
おまけに、転記元のセルでは、余計な改行が「いくつ入っていても」、
特に何もしない状態だったり、折り返し設定をOFFに戻したりすると、
その場合は上図の左側のままでして、
「ニセの1行表示のまま・ニセの正常に見えてる状態のまま」、なので、
「このバグの原因が、”余計な改行だ ”と気付きにくい・・・」、です。
しかも更に、勝手に、セルの「折り返して全体表示」の設定が「ON」に
なってしまい、その後もそのセルは、ずーっとその設定のまま、なんです。
そして、転記元のセルもいじったらいじったで転記先と同じ状態になります。
「な・く・せ・に」、
「手動のコピペやVBAでのコピペ処理(=VBAの代入での転記処理ではなく)」だと、
転記先セルでも(改行を含んでいるのに)「ニセ1行表示のまま」、
コピペされてしまいます。この場合は行高が異常にはなりません。
これも、原因を分かりにくくしているかもしれません。
ちなみにですが、文字列型のデータに、「Alt+Enterにより改行」が複数入っている場合はもちろん、
一番末尾に「たった1つ」、入っただけでもこうなります。
ナニコレ?
なに?
なんなの?
このメチャクチャな動き。
マイクロソフトやExcel講師、パワーユーザーなどが「それは仕様だ」と言い張って、
初心者ユーザーなどに全然やさしくない態度を取るという、
「Excelあるある」のヤツです。
でもこれって、「仕様」ですか?
どこかの「意図しない設定」が「勝手に」「ONになってしまう」とか。
こんなのが「仕様」ですか?
しかも20年以上も放置。
顧客第一?
お客様第一?
意味がわかりません。
このバグは特に、
「ユーザーフォームを使わずに、シートをフォームの代用にしている場合」や、
「見積書や請求書を自動印刷するためのシートが作ってある場合」、
(※それ以外にも行高が勝手に変わると困るシートが作ってある場合)
などに関係があります。
その場合には、「超・超・超」「迷惑極まりないバグ」となって表面化することがあります。
逆に言うと、そのような状況でないと関係ないとも言えるのですが、
ただ、そのようなケースは結構あります。
特に、
「ユーザーフォームを使わずに、シートをフォームとして代用する方法」は、
「Excelフォーム」においての ある意味「正しい使い方」なので、
「そのような使い方をする人が多い/少ない」はまったく関係がありません。
「Excelで ”まともな画面 ”を作りたいと考える人は必ず、ユーザーフォームについては、
”仕方がない場合しか使わず ”、シートをフォームに見立ててそちらをメインに据える」ので、
今回のバグが出ると非常に困ります。
もちろん、
「見積書や請求書を自動印刷するためのシートが作ってある場合」も、
今回のバグが出ると非常に困ります。
こちらのケースは割と多いでしょう。
なのに(何度でも言いますが)マイクロソフトは、このバグを「20年以上放置」で
まったく直そうとしません。
このバグは、
「パソコンは小数計算を必ず間違う」という不具合と同じくらい、
Excelにおいては、
「最初から知っておかないといけない」、
「重要な不具合・バグ」、
なのに、それにもかかわらずなーんにもしない
なーんにも告知しない。
Excel講師の連中も同じです。
「注意情報」として最初に自著に書いたり、自分のサイトに書いたりしなければ
ならないはずなのに、まったくといっていいくらい、何もしません。
「アンタらホントに講師なの?」って思ってしまいます。
初心者の自分でも「おかしい」と感じてここまで調べるのに・・・。
多分、
「例えば、顧客名簿の入力画面を作るのに、
理由もないのによく考えもせず、
安直にユーザーフォームの利用を勧める」、
という、
「超・二度手間・三度手間」な「バカしかやらないこと」、
そんなことばっかりを自著や自サイトに書いて勧めてるから、
注意がそのバグに行かないんだと思います。
「シートの自動印刷」なども教えてない、ということなのかもしれません。
しかし、そもそもなんですが・・・、
なんでシートをフォーム代わりに使う方法をもっと広めないのでしょうか?
意味がわかりません。
顧客名簿の入力フォームなどは、以下の記事のような感じでやれば、
すぐにやれると思うんですけど・・・
『 顧客マスタ入力~ワークシートをフォームに見立てて、縦長のデータの行と列を入れ替えながら他のシートへ転記するサンプル。』
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/new_rec_add02_wsht-form01
「また愚痴ばっかり言いやがってアホか!」、と、あきれられてしまうとは思いますが、
でもこれ、本当にいやらしいバグなんですよね。
Excelに限って言えば、
「ちょっとしたシステムめいたもの、を作りたい場合」、には、
「必須」の、
「不具合解消のための知識」ですし、
「パソコンは小数計算をかならず間違う」という不具合と同じくらい、
「重要な知識」ですから、
是非、初心者の方々には知っておいてほしいと思います。
なので、今回は「セルのなかの余計な改行」が「どんな(変な)動きを招くか」の、
大体のところも一覧表にしました。
(意味不明かもしれませんが。)
次号以降でご紹介しようかと思います。
今回からは数回、そのようなことを書いていこうと思います。
では以降、本文です。
=============================
まず、今回は以下の画像のように、シートをユーザーフォームに見立て使うことを想定します。
(この図は顧客名簿入力のための画面ですが。)
https://euc-access-excel-db.com/00000WPIMG/2020-04-13---21-49-37.jpg
↑このJPEG画像の上半分の図が「フォーム代わりのシート」、ですね。
ちなみにですが、このサンプルでは、
縦に入力したデータを、配列とワークシート関数を使って、
「1行コード」で「縦のデータを横持ちに変換して」、
「別シートの最後の行に追加する」、
ということをしています。
↓
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/new_rec_add02_wsht-form01
このようなフォームでは、行の高さが勝手に3行分、4行分、などに広がってしまうと、
とても困ります。
また、
のような、見積書や請求書の自動印刷のケースも想定しています。
例えばこのような見積書や請求書には、品名、品番、摘要、備考、といった、
文字列型のデータを入力するわけですが、
それを一覧表からVBAで単純に転記して自動印刷する場合があります。
(多分結構あると思います。)
その際、文字列型のデータに余計な改行が入っていると、
こちらでも、(転記した瞬間に)転記先のセルの行の高さが、
3行分や4行分に勝手に広がってしまったり、あるいは、
値の一部しか表示されなかったり、
0.5mm程度の何が書いてあるかわからない「文字のカケラ」しか
表示されなかったりします。
それも今回のバグ、です。
↑この図の右側のようなセルが、例えば見積書などを「自動印刷したいとき」に
できあがってしまい、更には、
「とびとびの行が、勝手に3行分だったり、4行分だったり、正常な行もあったりで
各行バラバラに、行の高さが広がって ”自動印刷 ”されてしまったら」、
皆さん、どうします?
しかも原因がわかりづらい・・・。
特に、セルの値の「最後尾」に「1つだけ」、Alt+Enterでの改行が
入っているだけだと分かりづらいです。
更にしかも、勝手にセルに「折り返して全体表示」の設定が「ON」に
なってしまい、その後もずーっとそのセルはその設定のまま、なんです。
次も何かの拍子に勝手に行の高さが広がっちゃう。
「Range("セル番地") = Range("セル番地")」、といった感じで、
VBAで「=」の代入ステートメントで値の転記処理をしただけで、
転記先のセル(行)がそうなります。
左辺も右辺も、「Range("セル番地")」のあとに「.Value」を追記しても治りません。
なお、
の左側の部分の「ニセ正常」「ニセ1行」かたちは、
★PDFの表をExcelファイルに変換したとき
★どこかから表データがコピペされたExcelファイルが用意されたとき
に起こりがちです。
それらの場合、セル内に改行がいくつあろうが、上図の左側のように
「ニセ1行」「ニセ正常」の状態で目に映るので、注意が必要です。
WordやPowerPoint、その他のソフトからExcelファイルに変換したり、
表そのものをコピペしたりしたときにも、
同じようなバグが出ることがあるようにも聞いています。
(原因のWeb検索などをしてる最中に見聞き。)
何回でも書きますが、
なぜマイクロソフトはこのバグを直さないのか、あるいは仕様変更しないのか、
まったく意味がわかりません。(しかも、20年以上も。)
****************
●このバグの回避方法
このバグを回避するには、以下のことが必要です。
転記先セルでは必ず必要で、必要に応じて転記元セルでもやります。
転記先のセルを、更に別のセルに代入で転記処理しているような場合は、
更に何かを考えないといけない場合も出てくると思います。
(01)VBAでの「Range.Clear」メソッドは、代替フォームのシートや自動印刷用のシートでは
罫線も色も、その他の設定も全部消えて吹っ飛んでしまうので、使えません。
「Range.ClearContents」メソッドと、(02)以降のような設定をします。
罫線や色が無い印刷しないようなシートや、入力フォームの代替ではないシートなど
なら、「Range.Clear」メソッドや行丸ごとの削除でもOKですけど・・・。
転記処理直後やシートの初期化、正常化、自動印刷処直前、などに行います。
(02)勝手にONになってしまった「折り返して全体を表示」の設定をOFFにするだけでも、
「見た目的には」、戻ります。(ただし、「ニセ1行」として、ですが。)
VBAか普通に手動設定で行います。
これをやると、
セルの値の中に「Alt+Enterでの改行」がいくつあろうが、
勝手に無視?補正?されて「ニセ1行」として表示されます。
印刷も「ニセ1行」として、普通に正常になされます。
(03)ただし、それだけだと解決できない場合もあるので、その場合を想定して、
セルの値の改行を、置換操作などで全部消してしまいます。
これも、VBAか普通に手動設定で行います。
これで「ニセの1行」が「本当の不具合なしの1行」に変わります。
これで、もし転記先のセル書式の設定がおかしくても、
少しかもしれませんが、表示の不具合が起こる可能性が減ると思います。
(04)更に、「必要に応じて」とか、「念のために」とか、「想定を考えるの面倒」、
などの理由から、
(a)「縮小して全体を表示のOFF(既定)」
(b)「行の高さのオートフィット設定のON(既定)」
(c)「セル結合のOFF(既定)」
などもしておきます。
(a)はVBAか普通に手動設定で。
(b)はVBAか、目的のセルの行の境界でダブルクリックする。
(c)もVBAか普通に手動設定で。
で、できます。
****************
次回の号では、図で、「どんな感じの動きになるか」や「操作別の一覧表」などを
少しご提示していきたいと思います。
テキトーなのでうまく描けていませんが、「なんとなく」でもお分かりいただければ、
と思います。
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------