Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7243 / 13645 ツリー ←次へ | 前へ→

【40123】テキストボックスのデータ反映不具合 アーバン 06/7/7(金) 10:55 質問[未読]
【40133】Re:テキストボックスのデータ反映不具合 ハト 06/7/7(金) 13:06 回答[未読]
【40235】Re:テキストボックスのデータ反映不具合 アーバン 06/7/10(月) 8:44 回答[未読]
【40278】Re:テキストボックスのデータ反映不具合 ハト 06/7/10(月) 15:24 回答[未読]
【40286】Re:テキストボックスのデータ反映不具合 アーバン 06/7/10(月) 16:38 質問[未読]
【40295】Re:テキストボックスのデータ反映不具合 ハト 06/7/10(月) 18:02 発言[未読]
【40296】Re:テキストボックスのデータ反映不具合 ハト 06/7/10(月) 19:04 発言[未読]
【40307】Re:テキストボックスのデータ反映不具合 アーバン 06/7/11(火) 10:40 お礼[未読]
【40360】Re:テキストボックスのデータ反映不具合 アーバン 06/7/12(水) 15:03 お礼[未読]
【40366】Re:テキストボックスのデータ反映不具合 ハト 06/7/12(水) 16:07 発言[未読]

【40123】テキストボックスのデータ反映不具合
質問  アーバン  - 06/7/7(金) 10:55 -

引用なし
パスワード
   お世話になります。初心者です。宜しくお願いします。
検査基準書作成用の項目や数値の入力フォームをUserformで作成しました。
イメージでは、シートのデータフォーム的なもので、チェックボックスやラジオボタン
も必要なことから作成しました。
フォームへは、テキストボックス、チェックボックス、ラジオオボタン、ラベル、コマンドボタンが
いくつか配置されています。

方法は、1行を1項目用のデータレコードの概念で取り扱い、
1の行を各コントロールのコントロールソースに割り当て、データの窓の役割を、
2行以降を設定したデータの保存に割り当てで設計しております。
2ヶのボタンで項目移動を行い、仕組みは新規行(空白)又は、該当行のデータを
1行目と保存データ行間でコピペにて交換します。

質問内容は、一度入力された行を選択した時、数値入力用のある1つのテキストボックスで、
データ反映後の表示とセル内容がtrueやfalseになってしまいます。
又、その状態時に故意に数値を入力して訂正しても、再度行移動をして、
再度表示させても再現性があります。
他のテキストボックスでは、同じ数値用なのに、この不具合は発生しません。
何らかのプロパティ設定違いかと思い調べても比べても解らないので、
不具合反映テキストボックスを削除し、正常反映するテキストボックスをコピペで、
コントロールソースを目的セルへ設定して再度実行しましたが、なんと不具合が再現されます。

シートの方も、同じ数値データ列で正常/不具合反映される列での書式も比較調査し
ましたが、同じです。
ここで行き詰まりましたので、正しく数値が反映される様に、どこが問題点かを
指摘願います。
又、根本的に上記の仕組み自体が適切でない場合も別の方法を教えていただける
と助かります。
お願いします。

【40133】Re:テキストボックスのデータ反映不具合
回答  ハト  - 06/7/7(金) 13:06 -

引用なし
パスワード
   おはようございます

▼アーバン さん:

ソースコードを見てみないと正しく判断できないと思いますが

>データ反映後の表示とセル内容がtrueやfalseになってしまいます。
これからすると、データの反映、セルへの反映時に何か別の値をセットしているように思えます。

【40235】Re:テキストボックスのデータ反映不具合
回答  アーバン  - 06/7/10(月) 8:44 -

引用なし
パスワード
   ▼ハト さん:
おはようございます。早速のご回答ありがとうございます。

>ソースコードを見てみないと正しく判断できないと思いますが
については、移動ボタンの関係しか作成していない状態です。以下になります。
仕組みについては、1の行の各セルはUserformの各コントロールのコントロールソースに割り当て、
データ窓の役目を、移動の際は2の行以降をデータ用とし、カウント値に従いその行を1の行
へコピペ(交換)するだけです。

Private Sub upbutton_Click()
  'check characteristic data nothing
  If Range("a1").Value = "" Then
    MsgBox "特性名称の設定がされていませんので、項目移動できません" &            vbCr & "この項目設定は必須です。"
    Exit Sub
  End If
  'sub routin1
  ido1
  'new line no set
  Frame6.Tag = Frame6.Tag + 1
  'sub routin2
  ido2
End Sub

Private Sub downbutton_Click()
  'check action 0-1
  If Frame6.Tag = 0 Then Exit Sub
  'check characteristic data nothing
  If Range("a1").Value = "" Then
    MsgBox "特性名称の設定がされていませんので、項目移動できません" &            vbCr & "この項目設定は必須です。"
    Exit Sub
  End If
  'subroution1
  ido1
  'new line no set
  Frame6.Tag = Frame6.Tag - 1
  'sub routin2
  ido2
End Sub

Private Sub ido1()
  'Copy edit data area to clip borad
  Range("A1:AQ1").Select
  Selection.Copy
  'paste to old location(=.tag)
  Cells(4 + Frame6.Tag, 1).Select
  ActiveSheet.Paste
  Application.CutCopyMode = False
  Rows("1:1").Select
  Selection.ClearContents
  Range("A1").Select
End Sub

Private Sub ido2()
  'set next location
  Cells(4 + Frame6.Tag, 1).Select
  'check and set to new line data or this line no data
  If ActiveCell.Value = "" Then
    Range("A2:AQ2").Select
    Selection.Copy
    Range("A1").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
  Else
    Range(Cells(4 + Frame6.Tag, 1), Cells(4 + Frame6.Tag, 43)).Select
    Selection.Copy
    Range("A1").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
  End If
  Range("a1").Activate
  'set line no
  Frame6.Caption = "Inspection Item No." & Frame6.Tag + 1
End Sub
>>データ反映後の表示とセル内容がtrueやfalseになってしまいます。
>これからすると、データの反映、セルへの反映時に何か別の値をセットしているように思えます。
については、Userformにコントロールを配置しコントロールソースを設定したのみなので、思い当たる
ふしがありません。あとはシートの何かの設定が反映されるのでしょうか?
ご回答お願いします。

【40278】Re:テキストボックスのデータ反映不具合
回答  ハト  - 06/7/10(月) 15:24 -

引用なし
パスワード
   ▼アーバン さん:
ソース拝見させていただきました

>>>データ反映後の表示とセル内容がtrueやfalseになってしまいます。
>>これからすると、データの反映、セルへの反映時に何か別の値をセットしているように思えます。
>については、Userformにコントロールを配置しコントロールソースを設定したのみなので、思い当たる
>ふしがありません。あとはシートの何かの設定が反映されるのでしょうか?
>ご回答お願いします。

ソースでセットせず、コントロールソースの設定のみとしますと
そのセルをコントロールソースとしているオブジェクトが2個以上存在しているのでは?

テキストボックスにTRUE、Falseが出るということは
チェックボックス、ラジオボタンなどが、そのテキストボックスと同じセルをコントロールソースとしていると思われます

【40286】Re:テキストボックスのデータ反映不具合
質問  アーバン  - 06/7/10(月) 16:38 -

引用なし
パスワード
   ▼ハト さん:
ご回答ありがとうございます。

>ソースでセットせず、コントロールソースの設定のみとしますと
>そのセルをコントロールソースとしているオブジェクトが2個以上存在しているのでは?
>
>テキストボックスにTRUE、Falseが出るということは
>チェックボックス、ラジオボタンなどが、そのテキストボックスと同じセルをコントロールソースとしていると思われます

はい、たしかにその可能性もあると思いまして、全てのコントロールソースを確認しましたが、
重複はありませんでした。
そこで、まだ調査が不十分なことろがありますでしょうか?又は、さらに他の要因が
考えられますでしょうか?
あと、”ソースでセット”とありますが、コピペで交換式ではなく、コントロールソースの番地
指定を変化させていくということでしょうか?又、その方法はポピュラーですか?
何分、シートのデータフォームの様にいかず、スピードがかなり遅いので、もう少しは早い手法は
ないかと思ってもおります。
ご回答をお願いします。

【40295】Re:テキストボックスのデータ反映不具合
発言  ハト  - 06/7/10(月) 18:02 -

引用なし
パスワード
   ▼アーバン さん:
>▼ハト さん:
>ご回答ありがとうございます。
>
>>ソースでセットせず、コントロールソースの設定のみとしますと
>>そのセルをコントロールソースとしているオブジェクトが2個以上存在しているのでは?
>>
>>テキストボックスにTRUE、Falseが出るということは
>>チェックボックス、ラジオボタンなどが、そのテキストボックスと同じセルをコントロールソースとしていると思われます
>
>はい、たしかにその可能性もあると思いまして、全てのコントロールソースを確認しましたが、
>重複はありませんでした。
>そこで、まだ調査が不十分なことろがありますでしょうか?又は、さらに他の要因が
>考えられますでしょうか?

すみません、申し訳ないですが、今のところ他に思い当たるところがありません

>あと、”ソースでセット”とありますが、コピペで交換式ではなく、コントロールソースの番地
>指定を変化させていくということでしょうか?又、その方法はポピュラーですか?

コントロールソースの番地指定を変化させていくというやり方もありますが、
もっと直接的に

  TextBox1.Value = Range("A1").Value
  Range("A1").Value = TextBox1.Value

のようなのを考えていました

【40296】Re:テキストボックスのデータ反映不具合
発言  ハト  - 06/7/10(月) 19:04 -

引用なし
パスワード
   >何分、シートのデータフォームの様にいかず、スピードがかなり遅いので、もう少しは早い手法は
>ないかと思ってもおります。
>ご回答をお願いします。

スピードアップという点に関しては

1. Select は極力使わない

例えば

Private Sub ido1()
  'Copy edit data area to clip borad
  Range("A1:AQ1").Select
  Selection.Copy
  'paste to old location(=.tag)
  Cells(4 + Frame6.Tag, 1).Select
  ActiveSheet.Paste
  Application.CutCopyMode = False
  Rows("1:1").Select
  Selection.ClearContents
  Range("A1").Select
End Sub


Private Sub ido1()

  Range("A1:AQ1").Copy Destination:=Cells(4 + Frame6.Tag, 1)
  
  Rows("1:1").ClearContents
  Range("A1").Select  '←これも不要?

End Sub

ですみます

2. Application.ScreenUpdating = Falseを使う
例えば

Private Sub ido1()
  
  Application.ScreenUpdating = False

    ・・・・・・
    ・・・・・・
    ・・・・・・
    ・・・・・・
    ・・・・・・

  Application.ScreenUpdating = True

End Sub

というところでしょうか?

【40307】Re:テキストボックスのデータ反映不具合
お礼  アーバン  - 06/7/11(火) 10:40 -

引用なし
パスワード
   ▼ハト さん:
早速のご回答ありがとうございます。
なるほど、現在の私のプログラミングでは、確かにSelectを多用していると
思います。
何分、初心者なので、操作の記録の切り貼りだけでは進歩しませんよね。
今後は、更に工夫してみます。
下記も大変参考になります。
色々とありがとうございました。
謎の不具合は、もっと調べてみます。
今後も何かありましたら、よろしくお願いします。

>Private Sub ido1()
>
>  Range("A1:AQ1").Copy Destination:=Cells(4 + Frame6.Tag, 1)
>  
>  Rows("1:1").ClearContents
>  Range("A1").Select  '←これも不要?
>
>End Sub
>
>ですみます
>
>2. Application.ScreenUpdating = Falseを使う
>例えば
>
>Private Sub ido1()
>  
>  Application.ScreenUpdating = False
>
>    ・・・・・・
>    ・・・・・・
>    ・・・・・・
>    ・・・・・・
>    ・・・・・・
>
>  Application.ScreenUpdating = True
>
>End Sub
>
>というところでしょうか?

【40360】Re:テキストボックスのデータ反映不具合
お礼  アーバン  - 06/7/12(水) 15:03 -

引用なし
パスワード
   ▼ハト さん:

謎の不具合が解明しました。
1ヶのオプションボタンを文字の書体関係、幅、高さなど一定のものを作成し、
あとは、コピペで配置していたのがいけませんでした。
プロパティウインドのドロップダウン内を再度見回したら見慣れないものが一つ・・・
ある1つのオプションボタンにそのそっくりさんが同じ位置に重なっておりました。
コピペ後の位置移動し忘れが1つあったと言うことと思います。

削除後は、問題なくテキストボックスのコントロールソース通りデータは反映され、解決しました。
お騒がせとなりました。tabstopの様に1ヶのコントロールのコントロールソースを変更すれば、
重複しない様な仕組みには、なっていなかったのですね。

しかし、教わりましたselectを極力使わない下記の方法を早速取り入れ、
スピードアップやコードの減量でこころまでスッキリです。
ちなみに、Screenupdateingの方は、体感での変化はありませんでした。
色々と本当にありがとうございました。
※何かのあとのRange("A1").Selectは、私の癖の様です。不要ですね。

>>Private Sub ido1()
>>
>>  Range("A1:AQ1").Copy Destination:=Cells(4 + Frame6.Tag, 1)
>>  
>>  Rows("1:1").ClearContents
>>  Range("A1").Select  '←これも不要?
>>
>>End Sub
>>
>>ですみます
>>
>>2. Application.ScreenUpdating = Falseを使う
>>例えば
>>
>>Private Sub ido1()
>>  
>>  Application.ScreenUpdating = False
>>
>>    ・・・・・・
>>    ・・・・・・
>>    ・・・・・・
>>    ・・・・・・
>>    ・・・・・・
>>
>>  Application.ScreenUpdating = True
>>
>>End Sub
>>
>>というところでしょうか?

【40366】Re:テキストボックスのデータ反映不具合
発言  ハト  - 06/7/12(水) 16:07 -

引用なし
パスワード
   ▼アーバン さん:
>▼ハト さん:
>
>謎の不具合が解明しました。
>1ヶのオプションボタンを文字の書体関係、幅、高さなど一定のものを作成し、
>あとは、コピペで配置していたのがいけませんでした。
>プロパティウインドのドロップダウン内を再度見回したら見慣れないものが一つ・・・
>ある1つのオプションボタンにそのそっくりさんが同じ位置に重なっておりました。
>コピペ後の位置移動し忘れが1つあったと言うことと思います。
>
>削除後は、問題なくテキストボックスのコントロールソース通りデータは反映され、解決しました。
>お騒がせとなりました。tabstopの様に1ヶのコントロールのコントロールソースを変更すれば、
>重複しない様な仕組みには、なっていなかったのですね。

解決してよかったですね
オブジェクトが重なってるとわかりずらいですよね(^^;

>しかし、教わりましたselectを極力使わない下記の方法を早速取り入れ、
>スピードアップやコードの減量でこころまでスッキリです。
>ちなみに、Screenupdateingの方は、体感での変化はありませんでした。
>色々と本当にありがとうございました。
>※何かのあとのRange("A1").Selectは、私の癖の様です。不要ですね。
>

Screenupdateingは、画面更新処理の停止、再開です
Select,Active,セルへの代入等が多い時に有効です

上記のような処理が20個あったとして
1個処理するたびに画面更新処理をするのではなく、(画面更新20回)
全部処理してから画面更新処理をすれば(画面更新1回)
全体の処理時間が早くてすみます

7243 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free