• ベストアンサー

エクセル:””をいれると左横のセルの文字列の表示が消える

よろしくお願いします。 例えば セル”C2”にIF(A2=1,"","×")などと関数を入力しているとします。 そこで、A2=1,B2に長文の文字列が入力されているときに、 C2には「""」が返されるわけですが、 B2に入力されている文字がさえぎられてしまいます。 尚、B列のセル幅はあえて「10」に設定しておきたい状況です。 C2に入れるIF関数を工夫することで、 A2=1の時に、B2の文字が長文でも表示できる方法はありますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.8

#05です。D,E列に変更があったときに実行されるようにしました。 Private Sub Worksheet_Change(ByVal Target As Range) Dim idx As Integer, res Dim OneSec As Single  OneSec = 0.000011 'EXCEL内部で1秒は1/(24*60*60)≒0.000011  On Error GoTo End0  With Target   If .Column = 4 Or .Column = 5 Then '修正がD列またはE列なら    Application.EnableEvents = False 'マクロ内でセルを更新するためイベント発生を止める    If Cells(.Row, 4) = "" Then     Range(Cells(.Row, "G"), Cells(.Row, "EU")).ClearContents 'G:EU列をクリア    Else     res = Application.Match(Cells(.Row, 4) + OneSec, Range("G1:EU1"), 1)     If IsNumeric(res) Then '検索してHitしたら何番目の列かが返る、そうでないときエラーが返る      Range(Cells(.Row, "G"), Cells(.Row, "EU")).ClearContents      Cells(.Row, res + 6).Value = Cells(.Row, "E") 'E列の値をHitした列に格納     End If    End If   End If  End With End0:  Application.EnableEvents = True End Sub シートがアクティブになるとき全ての行に対して実行するなら以下のマクロを同じシートに貼り付けて下さい Private Sub Worksheet_Activate() Dim idx As Integer, r As Range, res Dim OneSec As Single OneSec = 0.000011 On Error GoTo End0 Application.ScreenUpdating = False Application.EnableEvents = False For Each r In Columns("E:E").SpecialCells(xlCellTypeConstants, 23) Range(Cells(r.Row, "G"), Cells(r.Row, "EU")).ClearContents Next r For Each r In Columns("D:D").SpecialCells(xlCellTypeConstants, 23) '.SpecialCells(xlCellTypeConstants, 23)は定数値があるセル(編集→ジャンプと等価) With r res = Application.Match(.Value + OneSec, Range("G1:EU1"), 1) If IsNumeric(res) Then Application.EnableEvents = False Cells(.Row, res + 6).Value = Cells(.Row, "E") End If End With Next r End0: Application.EnableEvents = True Application.ScreenUpdating = True End Sub

yastaro
質問者

お礼

お正月早々、早速のご回答ありがとうございます。 まずは、お礼を申し上げたく、心より感謝いたします^^ イメージ通りの結果ができました。 また、詳しい解説をつけていただいて、本当にありがとうございます。 ご解説いただいた、詳しい内容やコードについて、本を片手にこれから勉強してみます。万一、理解できない点はまたご質問申し上げるかもわかりませんので、ポイントについては、もう少しお時間いただけたらと思います。

yastaro
質問者

補足

お世話になります。 前半のコードについて、漠然とですが、理解できました。 ありがとうございました。まだまだ勉強が必要なようです。 あつかましいお願いで大変恐縮なのですが、 後半のコード(シートがアクティブになるとき全ての行に対して実行) について、もう少し、詳しい解説をいただけないでしょうか? やはり私には高度なコードで、概要の理解すら追いつかないです。 業務では、こちらのマクロを使わせていただきたいと思います。 そのためにも、もう一歩理解して使用させていただきたく、どうか、よろしくお願いいたします。

すると、全ての回答が全文表示されます。

その他の回答 (8)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.9

こんばんは。#6で書いたWendy02です。 zap35さんから、すでに同じようなものが出ていて、それに対抗するようなものを出しても、しょせん、このレベルの内容では、ある一定のレベルに達した人は、同じようなマクロしか出来上がりません。こちらは公開するのはやめます。また、私は、仮に公開しても自分のコードの解説は、基本的にはしません。個々に疑問あるならQ&Aはしますが、すべてを解説しても、コードを書いた本人の自問自答でしかありませんから、意味が通じないと思います。もし、加工したり変更したりする場合、最初から、そういう設定で作ります。 ただ、本来は、ExcelのVersion が出ていれば、もう少し基礎的なマクロも書けたかと思います。ここの中で公開されたマクロは、ある意味、特殊な書き方をしているものだと思います。 VBAだけは、OJT(仕事の中で覚える)が出来ません。覚えるための流れや段階があります。ここのカテゴリでは、何度かお勧めの本なども紹介されています。コードの個々の解説をしても、ここは、中級レベルとか、ここは基礎レベルとか、いろいろ混在しています。それぞれの基礎的な知識があれば、すぐに理解できるものではあっても、すべてを同じように扱ったのでは、覚えられないと思います。 yastaro様は、こうして、もう、1年以上前から、マクロとは出会っていますから、どうやって、マクロ(VBA)を覚えるかという方法を自分自身で確立したほうがよいと思います。

yastaro
質問者

お礼

アドバイスありがとうございます。 今回は関数で処理しようとしたことがマクロでできるということそのものに驚きを感じました。 1年ほど前までマクロを自動記録させたものを応用することしか知らなかったものにとってはマクロの可能性に驚きの連続で正直どこから手をつけたらよいのか、やはり混迷しています。 たとえば、最近、DO~LOOPステートメントの基礎的な書き方を本で勉強始めたばかりです。頑張ってみます^^

すると、全ての回答が全文表示されます。
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.7

D列に入力した時刻が1行目G:EU列に一致した場合、E列の値を転記すればよいのでしょうか。#05です。既に解決済みとは思いましたが一応マクロを書きました。 #06さんの回答にも書かれているように時刻の比較は誤差の関係で期待通りに動作しないことがあるため「D列に入力した数字の近似値」で検索しています。従って7:06と入力したときその値以下の最大の時刻(この場合7:05)にヒットします。 もし1分でもずれたら何も表示させたくないならその旨補足して下さい。またD列の値が1行目の時刻にヒットするとG:EU列の数値は一旦クリアされます。これが不都合な場合も補足お願いします Private Sub Worksheet_Change(ByVal Target As Range) Dim idx As Integer, res Dim OneSec As Single  OneSec = 0.000011  On Error GoTo End0  With Target   If .Column = 4 Then    res = Application.Match(.Value + OneSec, Range("G1:EU1"), 1)    If IsNumeric(res) Then     Application.EnableEvents = False     Range(Cells(.Row, "G"), Cells(.Row, "EU")).ClearContents     Cells(.Row, res + 6).Value = Cells(.Row, "E")    End If   End If  End With End0:  Application.EnableEvents = True End Sub マクロは#05で回答したとおりに貼り付けて下さい

yastaro
質問者

お礼

申し訳ありません。補足を投稿したあと、次のことに気がつきました。 ◆E列(備考)に入力してからD列(時間)を入力するとうまくいく。 ◆D列(時間)を先に入力してからE列(備考)を入力しても反応がない ★そこで、例えばVBAの実行について、D列→E列入力順でも結果が返されるようにはなりませんか?あるいは、「シート」のタブをクリックするなどのとき、そのコードが実行される(すべて更新される)のが理想です。 また、コードの内容の勉強をしたいのですが、もう少し解説をいただければ幸甚です。 尚、ご指導いただけますでしょうか?

yastaro
質問者

補足

年が明けてしまいました。 反応が遅くなりまして申し訳ありません。 >D列に入力した時刻が1行目G:EU列に一致した場合、E列の値を転記すればよいのでしょうか。 について、ありがとうございます。その通りです。 しかし、ご指導の通り、コードを貼り付けてみましたが、全く反応がありませんでした。私の何かかが間違っているのでしょうか。 標準モジュールに自動記録させたマクロを修正する程度のVBAの技術しかない私にはまだまだ、レベルが追いつきません。もしよろしければ、もう少しご指導お願いできますでしょうか?

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 私には、何か、最初の質問の内容と、ぜんぜん違うような気がします。私には、どう質問を理解してよいのか、いまだよく分かりません。あくまでも、#5 の補足に対するものです。動的に削除や代入する場合は、イベント・ドリブン型のVBAしかありません。 D2 に代入されると、E2 の備考欄の内容が、その同じ列の同じ時間のところに表示されるというように作りました。 >◆D2に「9:45」などと時間のデータを入れています。 以下のマクロは、あくまでも、D列2行目以降に、データを入れた時にだけ、その同じ行に対して、備考がコピーされます。 >シート全体の中の""を備考を表示させるために、 シート全体という問題ですと、また違ってきます。 とりあえず、このようなマクロを提供させていただきます。 マクロの取り付け方: そのマクロを取り付けようとするワークシートのシートタブ(下部)を右クリックすると、「コードの表示(V)」というメニューがありますから、それをクリックしてください。そして、開いた画面に、以下のコードを貼り付けて、Alt + Q で閉じれば設定は完了です。 '-------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range)  Dim i As Integer  Dim Ref As String  'データ範囲  G1が開始位置の場合  With Range("G1", Range("IV1").End(xlToLeft))   If Target.Column = 4 And Target.Row > 1 Then    On Error Resume Next    i = 0    '時間表示は、入力の仕方により浮動小数点誤差丸めが発生するので、    'XL Versionによって、Findメソッドが使えない。    i = WorksheetFunction.Match(Target.Value + 5 * 10 ^ -7, .Cells, 1)    On Error GoTo 0    If i > 0 Then     Ref = Cells(Target.Row, 5).Value '備考欄(5 =E列)     If Ref <> "" Then       Application.EnableEvents = False       .Cells.Offset(Target.Row - 1).ClearContents      .Cells(Target.Row, i).Value = Cells(Target.Row, 5).Value      Application.EnableEvents = True     End If    End If   End If  End With End Sub '-------------------------------------

yastaro
質問者

お礼

ありがとうございました。 #05さんのご指導で解決しました。 関数を縦横にフィルコピーしないとできないと思っていたことが VBAでこんなに簡単にできるということで驚きでした。 ご回答を心より感謝いたします。

yastaro
質問者

補足

お礼がおそくなりました。年があけてしまいました。よろしくお願いします。 アドバイスを心よりありがとうございます。 E列(備考)に入力してからD列(時間)を入力するとうまくいきました。しかし、当初、D列(時間)を先に入力してからE列(備考)を入力しても反応がなかったので、今にいたるまで悩んでいました。 ★そこで、例えばVBAの実行について、D列→E列入力順でも結果が返されるようにはなりませんか?あるいは、「シート」のタブをクリックするなどのとき、そのコードが実行される(すべて更新される)のが理想です。 また、私のVBAのスキルが自動記録させたものを修正して使う程度なので、コードの内容の勉強をしたいのですが、もう少し解説をいただければ幸甚です。 尚、ご指導いただけますでしょうか?

すると、全ての回答が全文表示されます。
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.5

ご質問の内容はあくまで「例えば」だそうですから実際のシートはもっと複雑だと思いますから、あまり汎用的な回答ではないのですが、以下のようなマクロを使ってA1が1ならC1をクリア。1以外なら×を表示させるようなことは可能です Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Address = "$A$1" Then '値が変更されたのがA1なら以下を処理   If Target.Value = 1 Then   ’値が1なら以下を処理    Range("C1").ClearContents  ’C1をクリア   Else              Range("C1").Value = "×"  ’1以外ならC1に×を代入   End If  End If End Sub マクロはシート名タブ右クリック→コードの表示で開く画面に貼り付けて下さい。シートに戻りA1の値を1や、それ以外に変えてみるとC1の値が変わります

yastaro
質問者

補足

ありがとうございます。 お察しのように、実は、今回の質問例はわざとシンプルな例にかえてみたのですが、 実際の業務では、大変わかりにくて恐縮ですが、次のようなものです。 ◆1行目には5分単位で時間をG1に「7:00」 H1に「7:05」 I1に「7:10」 ・・・と横にずっと19:00まで入れています。セル幅は小さくしています。 ◆D2に「9:45」などと時間のデータを入れています。 ◆E2に「備考」として文章が入ります。 ◆「G2」に=IF($D2=G$1,E$2,"")とG2からずっと右横にフィルコピーしています。 時間が一致した列に備考文章が表示されるのですが、その右が""を帰されるので、備考文章がさえぎられるのです。 そこで、実際には縦(下)同様にデータがあるのですが、 シート全体の中の""を備考を表示させるために、一度に早く、空白にかえてしまいたい。ということができるでしょうか? アドバイスいただいたVBAだけでは初心者の私の理解が追いつかないため、引き続きご指導してくだされば幸甚です。よろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 >A2=1の時に、B2の文字が長文でも表示できる方法はありますでしょうか? セル幅を絶対的に、「10」にしておかなくてはなりませんが、 =IF(A2=1,MIDB(B2,11,246),"X") どちらかというと、 C2: IF(A2=1,"","×") A2 が、False の場合ではありませんか? そのときに、C2 をどう扱うかのほうが問題だと思います。

すると、全ての回答が全文表示されます。
  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

B列を「表示しない」にする。 C2の数式 =IF(A2=1,B2,"×") とすれば、希望の動作に近いと思います。 A2が1以外のとき、B2の内容も少し表示したいならこんな感じで。 =IF(A2=1,B2,RIGHT(B2,10) & "×")

すると、全ての回答が全文表示されます。
  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.2

#1 hana-hana3 さんのいう通り無理です。 B2セルの文字をテキストボックスに入れてB2セルの上に貼り付けてはどうでしょう。 テキストボックスを塗りつぶし無しに設定することで、A2セルの内容と重なった場合も(見づらいですが)両方の文字を見ることができます。

すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>A2=1の時に、B2の文字が長文でも表示できる方法はありますでしょうか? C2を完全に空欄にする以外に方法はありません。 つまり、式も値も入っていない状態になっているのが条件なので、ご希望ような動作をさせる事は無理です。

すると、全ての回答が全文表示されます。

関連するQ&A