Excel (VBA)

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

 
(指定なし : 指定なし)
フォームのテキストボックスに入力できない
投稿日時: 21/06/15 10:03:15
投稿者: vaioyuki

お世話になっております。
 
パスワードを入力するフォームを作成しました。
 

Option Explicit

Private Sub bt_PW1_Click()

If txt_PW1 = "1234" Then
    Unload UserForm1
    Call CSV作成
Else
    MsgBox "パスワードが違います。" & vbCrLf & "再入力してください。", vbExclamation
    
    With txt_PW1
        .Value = ""
        .SetFocus
    End With
End If

End Sub


Private Sub UserForm_Initialize()

With txt_PW1
    .IMEMode = fmIMEModeAlpha
    .TextAlign = fmTextAlignCenter
    .PasswordChar = "*"
End With

With UserForm1
    txt_PW1.SetFocus
End With

End Sub

 
これが突然?テキストボックスに入力できなくなりました。
メモ帳などにパスワードを入力して貼付は出来ます。
同じようなブックが他にもありますが、同じコード内容ですが入力できます。
 
元はフォーム1(CSV作成)とフォーム2(CSV排出)のフォームが2つあります。
こちらにフォーム3(他ブックからコピーしてくるもの)を追加しました。
フォーム3にはパスワードをかけていません。
 
再起動しても無理でした。
ほかに考えられることはありますか?
ご教授よろしくお願いいたします。

投稿日時: 21/06/15 13:30:23
投稿者: vaioyuki

追記です。
ひとつ判明しました。
 
パスワードのフォームを開くボタンがあるシートに、
会社コード、会社名、日付、入力担当を入れるセルがあります。
それぞれに入力規制を設けているのですが、
入力担当を入れると入力フォームのパスワードに入力できなくなりました。
入力担当のセルには「=LENB(B4)=LEN(B4)」と入れていて、半角数字以外は打てないようにしました。
これを外すと入力できました。
 
なんの原因が考えられますか?
教えてください。

回答
投稿日時: 21/06/15 17:57:25
投稿者: WinArrow
投稿者のウェブサイトに移動

説明だけの情報では、問題は推測できません。
 
まだ、説明していないことはありませんか?

投稿日時: 21/06/16 11:15:40
投稿者: vaioyuki

ありがとうございます。
 
説明していないところ。。。
なんでしょうか。。。
今は上にも書いたように、入力規則をなくしたら、すべての値に戻したら入力できるようになりました。
 
位置的には入力規則を設けていたセルはB4、
パスワードのフォームを呼び出すボタンはA14からB16くらいに設置しています。

回答
投稿日時: 21/06/17 09:33:44
投稿者: Suzu

引用:
テキストボックスに入力できなくなりました。
メモ帳などにパスワードを入力して貼付は出来ます。

 
『入力できない』とは、具体的にどのような状況なのでしょうか。
何を根拠に『入力できない』と判断されているのでしょうか。
 
貼り付けはできるとの事なので、そのテキストボックスに 入力カーソルは存在するのですよね。
値 を入力しても、文字が表示されない、カーソルが文字数分移動しない 等でしょうか?
それとも、何かメッセージが表示されるのでしょうか?
 
まさかとは思いますが、NumLockが外れていて、テンキー入力ができてないとかではありませんよね。
 
 
引用:
それぞれに入力規制を設けているのですが、
入力担当を入れると入力フォームのパスワードに入力できなくなりました。
入力担当のセルには「=LENB(B4)=LEN(B4)」と入れていて、半角数字以外は打てないようにしました。
これを外すと入力できました。

 
もしかして、そのセルがアクティブセルの状態から、当該フォームを開いていませんか?
また、当該テキストボックスが、フォームが開いた直後にフォーカスを取得する状態とか。
 
 
テキストボックスが、フォーカスがあったセルの条件を引き継いでしまって
不具合となっている可能性が考えられます。
 
 
・何にも無いセルを選択した状態で、フォームを開く
・当該フォームが開いたときに、それ以外のコントロールがフォーカスを取得する様にする
を行ってみてください。
 
 
それと、何故、イニシャライズの段階で、
テキストボックスのプロパティーを設定する必要があるのでしょうか。
それらのプロパティーは固定ですよね。VBAで設定する必要がありません。
デザインビューで設定しておけば済む話ですよね。
 
わざわざ、イニシャライズで SetForcusを行う必要性も不明です。
 
 
余計なコードは、余計な負荷を掛け、変な影響を及ぼす可能性があります。

回答
投稿日時: 21/06/17 09:44:01
投稿者: WinArrow
投稿者のウェブサイトに移動

> Unload UserForm1
> Call CSV作成
掲示のコードの中に
セルとの関連が記述さえていません。
つまり、ユーザーフォームを閉じる前に
セルB4に値をセットするところがないです。
このコードで動作していることが不思議なんです。
  
ですから、まだ、説明してないところがあるものと推測しています。

投稿日時: 21/06/17 14:47:44
投稿者: vaioyuki

ありがとうございます。
 
「入力できない」というのはカーソルがテキストボックス内にあるのに打てない状態です。
まさにNumlockの状態と同じだったので私もそれを疑いましたが違いました。
 
セルがアクティブな状態。。。というのに気づいて試してみました。
結果、
「=LENB(B4)=LEN(B4)」の入力規則があるセルが空白の場合は入力できました。 ⇒ 「****」の表示あり
しかし、セルに入力されているとセルがアクティブになっていなくても入力できなくなりました。
 

引用:
それと、何故、イニシャライズの段階で、
テキストボックスのプロパティーを設定する必要があるのでしょうか。
それらのプロパティーは固定ですよね。VBAで設定する必要がありません。
デザインビューで設定しておけば済む話ですよね。
  
わざわざ、イニシャライズで SetForcusを行う必要性も不明です。

 
これはこちらのことでしょうか?
 
With UserForm1
    txt_PW1.SetFocus
End With

 
フォームを立ち上げたときにボタンにフォーカスがされていて毎回マウスでカーソルをテキストボックスに合わせるのが面倒でこれを書きました。
余計なことだったんですね。。。(^^;)
 
 
セルB4は先に入力してからになるのでボタンを押してセットしません。
 
B1 ⇒ 会社コード
B2 ⇒ 会社名
B3 ⇒ 日付
B4 ⇒ 担当者
 
を入力して、CSV作成する際にこれらが必要になります。
CSV作成時に
 
Set Kcode = WSmacro.Range("B1") 'マクロシートの会社コード
Set Kdate = WSmacro.Range("L3") 'マクロシートの日付…日付は書式が決まっているのでB2セルをB3で変換している
Set Kuser = WSmacro.Range("B4") 'マクロシートの入力担当者

 
こちらでセットして使用しています。(会社名は視覚的に必要なだけでCSV作成には必要なし)
 
フォームを開いた時点でテキストボックスに入力できないのとこちらは関係あるのでしょうか?
今は入力規則をなくして使用していて、普通に入力できています。
 
 
現時点で私でわかっていることは、
 
入力規則をなくすと入力できる。
B4が空白だと入力できる。
 
の2点です。
 
よろしくお願いします。

回答
投稿日時: 21/06/17 15:21:36
投稿者: WinArrow
投稿者のウェブサイトに移動

ユーザー―フォームの中で
セルB4を参照していない・・・・
だから、ユーザーフォームに問題なはいと思います。
何のためのユーザーフォームなのかもわかりません。
 
セルB4には、どのようなタイミングで、どのように代入しているのでしょうか?
 

回答
投稿日時: 21/06/17 15:30:41
投稿者: Suzu

引用:
・何にも無いセルを選択した状態で、フォームを開く
・当該フォームが開いたときに、それ以外のコントロールがフォーカスを取得する様にする
を行ってみてください。

 
これらの結果はどうでしたか?
 
 
 
引用:
Set Kcode = WSmacro.Range("B1") 'マクロシートの会社コード
Set Kdate = WSmacro.Range("L3") 'マクロシートの日付…日付は書式が決まっているのでB2セルをB3で変換している
Set Kuser = WSmacro.Range("B4") 'マクロシートの入力担当者
 
  
こちらでセットして使用しています。(会社名は視覚的に必要なだけでCSV作成には必要なし)
  
フォームを開いた時点でテキストボックスに入力できないのとこちらは関係あるのでしょうか?
今は入力規則をなくして使用していて、普通に入力できています。

 
 
新しい事出てきましたね。。。
 
 
・このコードは、どんなイベントに書いてありますか?
・問題のフォームが開いている間、Kcode等は、Nothing ですか?
  →フォーム上のコードが動作している間も 変数上に保持される状態ではないですか?
    → フォームはモーダル?モードレス?
・コードから、入力規則のついたセルに値を入れていませんか?
   → その入力が、入力規則に反しており、フォームの裏で警告が出ていませんか?
・特定の処理をVBAで行った為に、その処理を契機に連鎖的に別の処理が発生していませんか?
  →特定の処理を行った為に、予め設定していた 入力規則等のメッセージ等、
   Excelが発しているメッセージ をフォームで隠していませんか?

回答
投稿日時: 21/06/17 15:36:37
投稿者: WinArrow
投稿者のウェブサイトに移動

入力規則の設定
>=LENB(B4)=LEN(B4)
は、どうかな?
 
こちらの設定が間違っているのか、4桁以外でもエラーにならない。
 
入力規則で
半角英数字だけを指定する場合は、
日本語タブで、「無効」を設定し、
設定タブでは、文字の長さを=4に設定すれば、大丈夫と思います。
 
 
 

回答
投稿日時: 21/06/17 18:04:33
投稿者: WinArrow
投稿者のウェブサイトに移動

>こちらの設定が間違っているのか、4桁以外でもエラーにならない。
 
すみません、誤解していました。
半角入力強制でしたね?
4桁は関係なかったですね・・・
 

回答
投稿日時: 21/06/18 07:33:12
投稿者: WinArrow
投稿者のウェブサイトに移動

再掲
 
セルB4とユーザーフォームのテキストオックスの関係が
掲示のコードだけからは、不明確です。
 
パスワード入力する方法は、
ユーザーフォームで入力し、妥当性をチェックし、それをセルに代入する
というのが、常套だと思いますが、
セルの入力規則でチェックできるのでしたら、
ユーザーフォームの目的は?

回答
投稿日時: 21/06/18 08:14:21
投稿者: mattuwan44

引用:
フォームを立ち上げたときにボタンにフォーカスがされていて毎回マウスでカーソルをテキストボックスに合わせるのが面倒でこれを書きました。
余計なことだったんですね。。。(^^;)

 
https://tripbowl.com/excel-vba/tab-order/
 
タブオーダーでフォーカスが当たる順番を変えてください。
 
「入力できない」
は、
「テキストボックスの値をシートに反映できない。」
ではなく、
「ユーザーフォームのテキストボックスに文字を入力できない」
なんですよね?
そうならば、ちょっと考えくいので、
新しいブックで再度、同じように作ってみて確認してみてはいかがでしょうか?
ブックが壊れていたりしませんかね。。。。可能性は低いとは思いますが。
 
それか、
セルが編集モードのときに、一生懸命、ユーザーフォームに入力しようとしているのかなぁ。。。。

回答
投稿日時: 21/06/18 09:11:00
投稿者: WinArrow
投稿者のウェブサイトに移動

WinArrow さんの引用:

再掲
 
セルB4とユーザーフォームのテキストオックスの関係が
掲示のコードだけからは、不明確です。
 
パスワード入力する方法は、
ユーザーフォームで入力し、妥当性をチェックし、それをセルに代入する
というのが、常套だと思いますが、
セルの入力規則でチェックできるのでしたら、
ユーザーフォームの目的は?

 
ようやく
ユーザーフォームのテキストボックスと
セルB4
の関係がわかりました。
 
テキストボックスのControlSorceの設定をやめて
テキストボックス側に入力規則設定と同じ判断コードを記述し
入力規則を解除
コマンドボタンで、セルB4に代入する
ような変更をお勧めします。

投稿日時: 21/06/18 10:42:53
投稿者: vaioyuki

みなさま、ありがとうございます。
 
私はご存じの通り、まだまだ未熟なものでみなさまほど高度なテクニックは使えません。
今の状態も本当に単純なものなんです。
 
「テキストボックスに入力できない」はmattuwan44さんの通り、
テキストボックスの値を反映するのではなく、
単純にキーボードを打っても反応がない、
Numlockのように打っても表示されない、反応がないというものです。
なので入力規則が設けているB4とユーザーフォームのテキストボックスとは何の関係もないです。
だけど、入力規則がなくなるとユーザーフォームのテキストボックスに入力できるようになります。
 
何度も開き直したり、
別ブックで作業したりしましたが同じ結果でした。
 

引用:
・このコードは、どんなイベントに書いてありますか?

 
複数のシートに貼付する形なので一部分だけ表示します。
 
With WSkanri2
    i = 0 '変数リセット
    r_cnt = 0 '最終行リセット
    r_cnt = .Cells(Rows.Count, "B").End(xlUp).Row '最終行取得

    If r_cnt >= 2 Then 'タイトル以外にデータがあれば
        For i = 2 To r_cnt
            .Cells(i, 1).Value = Kcode 'A列に会社コード
            .Cells(i, 5).Value = Kuser 'E列に入力担当
            .Cells(i, 6).Value = Kdate 'F列に日付
            .Cells(i, 7).Value = Kuser 'G列に入力担当
            .Cells(i, 8).Value = Kdate 'H列に日付
        Next
    End If
End With

 
固定で表示するものが多いのでこのような形でSetして表示するようにしています。
他のシートでも同じような使い方をしています。
 
Sub CSV作成() の中では、
 
With WSmacro
    If .Range("B1") = "" Then
        MsgBox "会社コードを入力してください"
        .Range("B1").Select
        GoTo continue
    ElseIf .Range("B2") = "" Then
        MsgBox "日付を入力してください"
        .Range("B2").Select
        GoTo continue
    ElseIf .Range("B3") = "" Then
        MsgBox "入力担当者コードを入力してください"
        .Range("B3").Select
        GoTo continue
    End If
End With

 
で必ず入力をチェックしていますので空白はありません。
 
しかし、
checkボタンを押す前に、上のコードを読む前にユーザーフォーム開いただけで何か影響があるのでしょうか?
 
 
セルが編集モードの場合だから。。。もないです。
B4以外をアクティブセルにしていても同じように入力できません。
 
入力できないという言い方がややこしかったのかもしれません。すいません。
・Numlockしていないのに同じような状態になる
・メモ帳などでパスワードを打ち、それをコピーしたら貼付できる
・入力規則を解除したら入力できる
 
伝え忘れていたこと、ありました。
入力規則はほかにも設定しています。
 
B1 ⇒ 6文字必須
B3 ⇒ 8文字必須
B4 ⇒ =LENB(B4)=LEN(B4)
 
です。
この中でB4の入力規則だけ外すと、ユーザーフォームに入力できます。

回答
投稿日時: 21/06/18 13:01:08
投稿者: sk

引用:
With txt_PW1
    .IMEMode = fmIMEModeAlpha
    .TextAlign = fmTextAlignCenter
    .PasswordChar = "*"
End With

With txt_PW1
    .IMEMode = fmIMEModeDisable
    .TextAlign = fmTextAlignCenter
    .PasswordChar = "*"
End With
 
-----------------------------------------------------------
 
以上のように書き換えても同様の現象が起こるのでしょうか。

投稿日時: 21/06/18 14:09:42
投稿者: vaioyuki

skさま
 

With txt_PW1
    .IMEMode = fmIMEModeDisable
    .TextAlign = fmTextAlignCenter
    .PasswordChar = "*"
End With

 
こちらで打てるようになりました!!
ありがとうございます!!
 
入力モードで引っかかてたんですね。
忘れないようにメモしておきます。
 
みなさま、ありがとうございました!!