7

現在、私を悩ませている問題に直面しています。誰かが私を助けてくれることを願っています。私は、Office 2007 (32 ビット) と Office 2010 (64 ビット) の両方を使用している大企業で働いています。会社全体で互換性のあるマクロを作成するのは、私にとって大変な作業でした (これまで VBA でプログラミングしたことがありませんでした。実際、このフォーラムは私を大いに助けてくれました)。私の仕事は、共有 Excel シートで 1 つの大きなテーブルを維持することです。いくつかのマクロといくつかのユーザーフォームがあります。ここで、問題を簡単に説明します。シートには、日付形式の 2 つの列 (開始日と終了日) が含まれています。両方の値は、ユーザー フォームのテキスト ボックスの列フォームにインポートされます (コマンド ボタンを押すと、MsCal がクラスにエクスポートされ、これらのテキスト ボックスが日付で埋められます)。私が単に必要としているのは、フィルタリングやその他の操作を実行するために、両方の列で日付形式を mm/dd/yyyy にすることです。この値が英語以外のローカリゼーションを使用するワーカーによって更新されると、米国の日付は dd.mm.yyyy として入力されます。それは、日付に基づく適切なフィルタリングを不可能にします。次の方法でフォーマットを変更しようとしました:

UserForm1.TextBox10.Value = Format(Calendar1.Value, "mm/dd/yyyy")

しかし、このコードはどういうわけか誤動作します。一部のマシンでは機能しますが、一部のマシンでは機能しません。そして、それが私に頭痛の種を与えているのです。これからどう進めばいいの?シートで同じ日付形式を使用し、Windows でローカリゼーション設定を無視するように Excel を強制する方法はありますか? 従業員は、ローカリゼーションを英語 (米国) に変更したくありません。これは、自分の形式に慣れているか、他のアプリケーションでそれが必要なためです。このシートが開いたときだけ一時的にローカライズを変更する方法はありますか? どんなアドバイスも高く評価されます。前もってありがとうピーター

4

2 に答える 2

1

あなたができる最善のことは、決して日付変数をテキストに変換しないことです。

Excel の内部では、日付は単なる連続した数字です (小数点の左側は日、右側は時間です)。たとえば、2012 年 6 月 10 日は、Excel では41188です。この日付値は、コンピューターに設定されている日付形式とは無関係です。

日付を表す場合 (人間が視覚化できるようにするため)、Excel はこの内部値を、コンピューターに設定されている形式で文字列にフォーマットします。したがって、たとえば、コンピューターで米国の日付形式を使用している場合、日付 41188 は 6/10/2012 の形式になります。

日付に関する大きな課題は、日付を正しい形式で入力することです。日付を文字列 ("6/10/2012") として入力すると、Excel はコンピューターに設定されている日付形式に応じて解釈します。US 形式の場合、最初の暗号を月、2 番目を日、最後の暗号を年とします。ドイツ語の形式の場合、最初が日、次が月、最後が年として読み取られます。したがって、米国形式の Excel の同じ入力 ("6/10/2012") は、ドイツ形式の Excel が 10 月 6 日を読み取るのと同様に、6 月 10 日を読み取ります。

あなたの場合、Textbox10 内の日付をフォーマットしないでください。米国形式の Excel では問題ありませんが、最初の暗号が月ではなく日である別の日付形式を使用している場合は、間違った値が返されます: この例を確認してください。ユーザーは、6 月 10 日をドイツ語形式の Excel (dd.mm.yyyy) で入力します。

  1. Calendar1.Value日付値を取得します ( 41188 )
  2. Format(Calendar1.Value, "mm/dd/yyyy")日付値を文字列 "06/10/2012" に変換します
  3. フォーマットされた日付 (STRING) を使用する場合、Excel はその日付を解釈する必要があります。コンピュータの日付形式はドイツ語であるため、Day:06、Month:10、Year:2012 と表示されます。41188の代わりに41070日を使用します。

が日付変数を取得し、このCalendar1.Value日付変数を日付形式の列に指定すると、常に列に正しいデータが取得され、列セル内で設定された日付形式やユーザーのコンピューターに設定されている形式。


Calendar1.Valueさて、あなたの場合、必要なセルに直接割り当てるのが最善です。何かのようなもの:

ThisworkBook.WorkSheets("Sheet1").Range("C3").Value= Calendar1.Value

ユーザーが選択内容を確認できるように TextBox10 に割り当てることはできますがCalendar1.Value、TextBox10 を無効にして、唯一の編集オプションがカレンダー コントロールになるようにします。また、日付を操作するときは、TextBox10 から取得するのではなく、Calendar1.Value.

Calendar1 から選択した値を textBox に表示する必要がある場合は、Textbox の日付をフォーマットしないでください。代わりに、次を使用します。

UserForm1.TextBox10.Value = Cstr(Calendar1.Value) 

このようにして、ユーザーは自分のコンピューターに設定し、慣れ親しんでいる日付形式で日付を確認できます。

于 2012-10-12T15:26:25.207 に答える
0

"mm/dd/yyyy"1 つの解決策は、日付数値形式を使用せず、書式文字列として指定するすべてのセル日付に対してカスタム形式のみを使用することです。ただし、私の経験では、コンピューターの地域設定が使用するように設定されている"mm/dd/yyyy"場合、この同じ文字列でカスタムセルフォーマットを作成しようとすると、Excel はコンピューター設定にリンクされたデータとして保持されるため、役に立ちません。これを回避する方法は、コンピューターの日付形式を変更し、セルをカスタムの「mm/dd/yyyy」としてフォーマットして保存することでした(そして、コンピューターの設定を元の状態に戻します)。は日付セルであると主張していますが、コンピューターの設定を変更してもセルの値は変更されないことがわかります。

もう 1 つの方法は、TEXT 関数を呼び出す日付セルの隣に常にセルを配置することだと思います。したがって、A1 に日付があり、別のセル=TEXT(A1, "mm/dd/yyyy")にある場合は、この新しいセルのみを参照してください。しかし、それはあなたのスプレッドシートを非常に乱雑にする可能性があります.

最良の解決策は、IT 部門に、会社の日付設定ですべて同じ形式を使用するように設定してもらうことだと思います。

于 2012-10-12T12:17:12.670 に答える