Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
コントロールのTextBoxの値を消してもリンク先が正しい空白にならない
投稿日時: 22/05/18 19:49:30
投稿者: tako552101

お世話になります。
 
シート2にコントロールのTextBoxを配置して数字を入力するようにしています。このコントロールはシート1のA1にリンクしてして、B1は「=A1/2」の計算式が入っているのですが、TextBoxの値を消去するとB1は「#VALUE」となってしまいます。
A1を選択してDeleteすればB1は「0」となるのですが、A1は非表示にしているので直接触ることができなくて困っています。解決策あるでしょうか?

回答
投稿日時: 22/05/18 20:07:39
投稿者: んなっと

B1
=IFERROR(A1/2,"")    

回答
投稿日時: 22/05/18 22:41:27
投稿者: WinArrow
投稿者のウェブサイトに移動

代案
 
B1に
=SUM(A1)/2

投稿日時: 22/05/19 09:46:20
投稿者: tako552101

やはり直接空白にすることはできないんですね。
仕様ですかね。

回答
投稿日時: 22/05/19 10:35:39
投稿者: んなっと

B1
=IFERROR(A1/2,"")  ""...長さ0の文字列
↑B1の「見た目だけを空白」にする式ですが、これではだめなのでしょうか。

引用:
直接空白にすることはできない

B1を「完全な空白セル」にしたいという意味ですか?

回答
投稿日時: 22/05/19 11:12:42
投稿者: WinArrow
投稿者のウェブサイトに移動

基本:テキストボックスのデータ型は文字列です。
従って、目視的に「空白」は、空白文字列となります。
    
一方、セルのデータ型のデフォルトは、表示形式:「標準」です。
標準というのは、スタンダードという意味ではなく、
Excelにお任せ・・・・Variant(何にでも対応できる)です。
つまり、Excelが入力データを解析して、データ型をきめていることになります。
セルに「空白」を入れる場合は、VBAで対応することになります。
  
見た目「空白」には、2種類あります。
(1)「空白」・・・・「正しい空白」と表現不要です。
(2)「空白文字列」・・長さ0の文字列です。
※数式では、「空白」を返すことはできません。
  
※[Delete]は、メソッドの1つです。
 数式(関数)では、メソッドを扱えません。
 

回答
投稿日時: 22/05/19 11:15:02
投稿者: WinArrow
投稿者のウェブサイトに移動

追伸
 
SUM関数には、対象セルの値が数値でない場合、「0」と見做す仕様になっています。

回答
投稿日時: 22/05/19 11:24:13
投稿者: Suzu

tako552101 さんの引用:
シート2にコントロールのTextBoxを配置して数字を入力するようにしています。このコントロールはシート1のA1にリンクしてして、B1は「=A1/2」の計算式が入っているのですが、TextBoxの値を消去するとB1は「#VALUE」となってしまいます。

 
シート2上に配置したテキストボックスの値が、 シート1 の A1 に表示する様になっているのですよね?
これは、どのように実現しているのでしょうか?
 
 
ここでいうテキストボックスは、
1:「挿入」-「テキスト」-「テキストボックス」 のテキストボックス
2:「開発」-「コントロール」-「挿入」-「フォームコントロール」-「テキストボックス」
3:「開発」-「コントロール」-「挿入」-「ActiveXコントロール」-「テキストボックス」
どれでしょうか?
 
「1」では、入力するには向きませんし
「2」は、手元Excel2019 では選択できず配置できません。
 
残るは「3」のActiceX のテキストボックス
 
フォーム上のテキストボックスなら、その値をVBAを使わずにセルに表示させる事はできますが
シート上の「3」のテキストボックスでは、
VBAを使い、A1にテキストボックスの値を代入するしか思いつきませんでした。
 
もし、VBAを使っているのであれば、そのVBAで、セル「B1」の処理をすれば良いのでは?

回答
投稿日時: 22/05/19 11:40:33
投稿者: んなっと

Suzuさん、ActiceX のテキストボックスでも
プロパティのLinkedCellをA1にすれば双方向で代入できますよ。

回答
投稿日時: 22/05/19 16:11:51
投稿者: Suzu

んなっとさん
 
LinkedCell ありがとうございます。 気づけませんでした。
 
 
------------------------------------------------------------------------
双方向リンクなのですね。
セル側のプロパティーでは ActiveX オブジェクトとのリンクを示す様なものが無いので
内部的に
 テキストボックスの値が変わったら セルに値を代入
 セルの値変わったら テキストボックスに代入
を行っているっぽいですね。
 
セルの値が変更された時に
 Worksheet_Change の Targetのアドレスを 判定し特定のセルの値の Chage検知させますが
その代わりに使えるかもですね。
余談でした

投稿日時: 22/05/20 01:10:39
投稿者: tako552101

みなさん、ありがとうございます。
 
コントロールのTextBoxでLinkedCellにしています。
便宜上B1としましたが、他にもA1を参照しているセルが複数あって、全て直すのも手間ですし、「#VALUE」のままだと、後のコード実行時に影響が出るので、TextBox消去でA1が空白になってくれればいいたけなんですが…
気づいてしまった以上、かかわるセルはエラー処理せざるをえないですね。

投稿日時: 22/05/20 01:15:14
投稿者: tako552101

ちなみに「TextBoxを消去したら、リンク先のA1セルを空白にする」はマクロで実現可能でしょうか。

回答
投稿日時: 22/05/20 07:19:59
投稿者: んなっと

TextBoxのイベントを使ってこんな感じで処理すると思うのですが、
  
  Dim v
  Dim Rng As Range
  Application.EnableEvents = False
  With TextBox1
    If Len(.Value) = 0 Then
      v = Split(.LinkedCell, "!")
      If UBound(v) > 0 Then
        Set Rng = Worksheets(v(0)).Range(v(1))
      Else
        Set Rng = Range(v(0))
      End If
      Rng.ClearContents
    End If
  End With
  Application.EnableEvents = True
  
LostFocusだと一瞬#VALUEが見えてしまいますね。Changeイベントでいいかもしれません。

回答
投稿日時: 22/05/20 11:22:33
投稿者: WinArrow
投稿者のウェブサイトに移動

キーボードイベントを使った例を紹介します。
 
[Enter]キーを押した時点で、イベントが実行されます。
 

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim shtName As String, CellName As String
    If KeyCode = vbKeyReturn Then
        With TextBox1
            If InStr(.LinkedCell, "!") > 0 Then
                shtName = Left(.LinkedCell, InStr(.LinkedCell, "!") - 1)
                CellName = Mid(.LinkedCell, InStr(.LinkedCell, "!") + 1)
            Else
                shtName = .Parent.Name
                CellName = .LinkedCell
            End If
            If .Text = "" Then
                Sheets(shtName).Range(CellName).ClearContents
            Else
                Sheets(shtName).Range(CellName).Value = .Text
            End If
        End With
    End If
End Sub

投稿日時: 22/05/22 08:08:37
投稿者: tako552101

みなさん、ありがとうございます。
検証してみます。取り急ぎお礼まで。

投稿日時: 22/05/31 15:18:28
投稿者: tako552101

解決済み忘れました