[[20210801071616]] 『【再質問】ユーザーフォームを表示した際及び更新』(ぶいえもん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『【再質問】ユーザーフォームを表示した際及び更新した際に日付の書式を一括で短い日付に変えたい』(ぶいえもん)

再質問(前回質問[20210730075402] https://www.excel.studio-kazu.jp/kw/20210730075402.html )となります。

件名のとおり、ユーザーフォームの更新及び表示するたびに
ユーザーフォームの日付を短い書式に一括で更新したいと考えています。
また、可能であれば、更新したオブジェクトに対してのみ短い書式に変えるような設定をフォーム全体またはオブジェクト全体に設定できればと考えています。

前回いただいたアドバイスを基に以下のような文を作ってみましたが、

ユーザーフォームのInitializeでしてもうまく動きません

   Dim c As MSForms.Control
    For Each c In Me.Controls
        If TypeOf c Is MSForms.TextBox Then
        c = Format(c, "ge.m.d")
        c.Text = c
    End If
    Next

どの部分に問題があるかご教示いただけると幸いです。

また、特定のオブジェクトのchangeの設定を、まとめて設定する方法(UserForm_changeがないので)があればご教示いただけると幸いです。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


訂正 短い日付 → 短い日付和暦 です。
(ぶいえもん) 2021/08/01(日) 07:37

前のスレッドで
□□.text = format(□□.text,"ge,m,d")
と書いていますが、そっちの方が良いのでは?
(試していませんが。)
(γ) 2021/08/01(日) 07:43

Yさん返信ありがとうございます。

    Dim c As MSForms.Control
    For Each c In Me.Controls
        If TypeOf c Is MSForms.TextBox Then
        c.Text = Format(c.Text, "ge.m.d")
    End If
    Next

とすると「型が一致しません」とエラーメッセージがでます。
(ぶいえもん) 2021/08/01(日) 08:03


そもそも元の文でも同様のエラーがでました(最初は出なかった気もしたのですが)
(ぶいえもん) 2021/08/01(日) 08:07

そもそもですが、そのテキストボックスには何を入れているんですか?
(γ) 2021/08/01(日) 08:33

シートに入力されている日付データです。

シートでは、書式 短い日付和暦になっています。

ユーザーフォームを呼び出したときにコントロールソースにA1などと入力しリンクさせています

そういった複数のテキストボックスが存在するため

そのデータをユーザーフォーム上短い和暦で表示し

更新後も短い和暦になるようにしたいと考えています

(ぶいえもん) 2021/08/01(日) 08:43


コントロールソースの値(に標準の日付書式を適用したもの)が上書きされる仕様のようですね。
その書式そのものを変更する手段を直ぐに示せませんが(コントロールパネルを操作?)、
コントロールソースをやめて、
シートから値をとってきて書式変換して書き込む方法が確実でしょうね。
他の方からの回答を待ってみてはどうですか?

(γ) 2021/08/01(日) 09:09


Yさんありがとうございます。

コントロールソースの参照をやめるか。

オブジェクト(名称が下一桁通し番号なので)配列を使って一括に変えるかのどちらかが今のところ現実的そうです。

他のサイトも参照して再度検証したところ。以下の文は有効だったのですが、
format(c.text,"ge.m.d" に置き換えるとやはりうまく動きませんでした。

======================

Private Sub UserForm_Initialize()

    Dim c As Control
For Each c In Controls
        If TypeName(c) = "TextBox" Then
            c = ""
        End If
    Next
End Sub
(ぶいえもん) 2021/08/01(日) 09:23

よ〜く読んでないので外してたらすいません。

 Private Sub UserForm_Initialize()
    Dim i As Long
    For i = 1 To 3
    With Me.Controls("TextBox" & i)
        .Value = Cells(i, 1).Value
        If IsDate(.Value) Then
            .Value = Format(.Value, "ggge年m月d日")
        End If
    End With
    Next i
 End Sub

こんなちゃうのかしら?
(あみな) 2021/08/01(日) 10:55


 >シートでは、書式 短い日付和暦になっています。
Range.Textプロパティを使用すればFormat関数は
不要なのでは?
(どん) 2021/08/01(日) 11:01

 日付データを入れるセルの書式を文字列にして、文字型でR.8.1とか書いたらどうですか?

 その日付文字データをその後どう利用するのか分からないですが、そっちの工程で一苦労して貰う。

(半平太) 2021/08/01(日) 12:25


半平太さんへ

コメントありがとうございます。

今回作ろうとしているエクセルは、とある作業で今後活用していく帳票作成用のもので。

一旦その入力支援として入力フォームを用意しておこうと考えているものとなります。

コントロールソースを設定するだけで、「入力支援」という部分は十分補えているのですが、
コントロールソースでユーザーフォームにリンクするとデフォルトで西暦表示になってしまいます。

運用上和暦をよく使うので、ユーザーフォームで表示したとき及び更新したときに和暦で表示したいと考えております。

なお、ご提案いただいた方法であれば、もちろん和暦表示になるのですが、「入力支援」という名目があり、文字列での運用をしてしまうと「〇/1」などと入力した場合に日付で運用する場合の入力支援の恩恵が受けられないため、文字列の運用は少し難しいと考えております。
(ぶいえもん) 2021/08/01(日) 14:08


どんさんへ

コメントありがとうございます。

Range.Textプロパティを使用すればFormat関数は
不要なのでは?

ご指摘のとおり「initialize」の初期値を和暦では表示されるのですが、半平太さんへの返信のとおり入力支援を目的としているので、ユーザーフォーム上でデータを更新しても、本来確認したい日付情報(和暦)で確認できた方が望ましいと考えておりましてFormat関数は必要と考えております。
(ぶいえもん) 2021/08/01(日) 14:17


あみなさんへ

コードありがとうございます。

あみなさんのやり方をベースに実行すると得たい結果になるのですが、フォームで入力した値をセルに返す文を書くのがめんどうだと思いまして、TextBoxのControlSource でデータをリンクさせつつかつ、一括して書式設定を変更する方法がないかと模索しております
(ぶいえもん) 2021/08/01(日) 14:36


やはりネックはコントロールソースを使っている点のように思えてきました

なんとかいい方法があるといいのですが…
(ぶいえもん) 2021/08/01(日) 14:37


>フォームで入力した値をセルに返す文を書くのがめんどうだと思いまして
そんなに面倒くさいのならマクロ止めな。
(めんどくさい) 2021/08/01(日) 14:58

めんどくさいさん

コメントありがとうございます。

誤解があれば申し訳ありません。
今回作ろうとしているエクセルは、マクロの知識のない自分以外の人が今後継続していくものであり、極力マクロを記載せず、デフォルトの機能やわかりやすい内容で渡したいと考えているため、【目的をマクロをできるだけ使わずかつ便利に使ってもらう】ために作っているものです。

自分自身は、今後もVBA以外の言語の学習を継続していく所存です。

しかしながら、「めんどくさい」は不適切な言葉でした。
上記理由から訂正しますと、「今後使う人また修正していく人のためにマクロの記述を減らしたい」が理由です。

(ぶいえもん) 2021/08/01(日) 15:03


【現時点の結論】
 推察ですがtextboxのプロパティはコントロールソースは常にリンクしていると思われる。
 また、日付データについては、西暦表示がデフォルトになっているまた、VBAのフォーマット関数もコントロールソースの性質上、シート側のデータをリンクしているという事実(西暦表示)が優先される。
 よって、コントロールソースを設定している場合の、和暦表示は不可能。
 また、和暦表示を優先する場合は、コントロールソースを設定せず、個別にtextプロパティやフォーマット関数で指定する必要がある。

 ということだと認識しました。

 多くの方にコメントいただき感謝します。
(ぶいえもん) 2021/08/01(日) 15:04


ちょっとやりたい動作を纏めて欲しいです。
(和暦表示)の表示は後回しでいいから動作の説明が重要かと思いますが...

例えば下記のように、文章は簡潔に流れ重視で!!

1.シートに複数の日付入力がある(作業列)

2.これをUserForm_Initialize呼び出し動作で

3.複数のtextboxへ(和暦表示)で反映させる。

4.textboxの日付けを更新したら←ここが理解しずらいですね。更新は毎日ってこと?

 ・手動でするのが手間ってこと?
 ・いっぺんにtextboxを更新するってこと?
 ・ユーザーフォームの更新及び表示するたびに?←意味が解りません。

5.Sheetの複数セル(作業列ではない)へ反映させる

(あみな) 2021/08/01(日) 15:56


>シートに入力されている日付データです。
これをtextboxにただ単に表示させるだけですか。
表示した後どうするんですか。
(yu) 2021/08/01(日) 20:53

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.