プロが教える店舗&オフィスのセキュリティ対策術

Format(Date, "dd")の数値表記と
Right("0" & day(Date), 2)の数値表記が
違うものとして認識されるようです。
(例 ピボットテーブルで同じ”11”が2つ存在する)


手動で数値を入れたときや
強制的に月初”01”を入れたいときに
Formatで表記したものと同じ状態にしたいです。

A 回答 (2件)

#1補足欄への返信です。



> 検証はしましたが今回の問題とのつながりがわかってはいません。

「ピボットテーブルで同じ”11”が2つ存在する」 というのが 「今回の問題」 ですよね?
単純化すると、
「2つ」のうち、1つは【数値】、1つは【文字列値】、なのではないですか?ということを書きました。
例えば、その日付がC3セルにある場合、適当な空いてる列を使って、
 =ISTEXT(C3)
という数式の戻り値に相違がないか確認してみては如何でしょう。
 見た目の【表示】は "11" 。 【値】が【文字列値】の "11" ならば、TRUE
 見た目の【表示】は "11" 。 【値】が【数値】の 11 ならば、FALSE
相違が見られたならば、どちらかに統一する方法は難しくないですよね。

VBAの Format 関数については既述の通りで補足しなくてもいいと思います。

今回の補足を加味すると
 見た目の【表示】は "11" 。 【値】が【文字列値】の "11" 。
 見た目の【表示】は "11" 。 【値】が【文字列値】の " 11" 。
と、目に見えない半角スペースが紛れているケースも考えないといけないのですかね。
この場合は
 =C3="11"
という数式で確認もできますが、
ワークシートメニューの[検索・置換]機能で、検索値に半角スペースを指定するだけで
確認から解決まで容易にできると思います。

///

> TextBox10.Text = Str("01")
>
> としたときにテキストボックスに「01」ではなく「1」と表示される問題でつまづいています。

〓〓〓〓〓〓〓〓〓以下VBAヘルプから引用〓〓〓〓〓〓〓〓〓
Str 関数

バリアント型 (内部処理形式 String の Variant) の値を返します。
数式の値を文字列で表した値 (数字) で返す文字列処理関数です。

構文
Str(number)

引数 number には有効な数式を長整数型 (Long) で指定します。
この引数は必ず指定します。

解説
数値を文字列に変換すると、戻り値の先頭に符号を表示するためのスペースが常に確保されます。
数値が正の場合は、Str 関数の戻り値の先頭にスペースが挿入されます。
このスペースはプラス記号を意味します。

日付、時刻、通貨、ユーザー定義の書式などで数値を書式設定するときに、Format 関数を使います。
Str 関数と異なり、Format 関数を使用して変換した場合は、
引数 number の先頭にスペースは挿入されません。

メモ Str 関数は、ピリオド (.) だけを有効な小数点記号として認識します。
異なる小数点記号を使用する場合は、CStr 関数を使って数値を文字列に変換します。
〓〓〓〓〓〓〓〓〓以上引用(改行は筆者)〓〓〓〓〓〓〓〓〓〓

    要点整理
  Str 関数の引数は「数字」ではなく【数値】です。
  Str 関数の戻り値は「数字」【文字列値】です。
  数値が正の場合は、Str 関数の戻り値の先頭にスペースが挿入されます。

まず、Str 関数は本来【数値】を【文字列値】に置換する為の関数です。
なので、= Str("01") のような使い方をするものではありません。
TextBox10.Text に "01" を設定したいということなら、
 TextBox10.Text = "01"
または
 TextBox10.Text = Format(1, "00")
です。

【数値】を指定するべき引数に【文字列値】を指定した場合、
引数の【文字列】が「数字」として読めるならば、
自動的に引数の「数字」を【数値】に置換する機能(型のキャスト)が働きます。
よって、
> TextBox10.Text = Str("01")
は、
 TextBox10.Text = Str(1)
と命令しているのと同じことになります。

> ......テキストボックスに「01」ではなく「1」と表示される......

= Str(1) の戻り値は先頭に半角スペースがある ■ 1■ です。■01■でも■1■でもありません。

Str 関数の使い途としては、
  【数値】(正整数)を【文字列値】に変換しながら、先頭に半角スペースを付加する
というのが現代的な存在理由で、他の使い方をする例はここ数年見かけません。

///

確認しておいて欲しいのですが、
今回の#1、そして前スレ、どちらも『セル』の【値】と【表示形式】と【データ型】の話をしました。
『TextBox』は『セル』とは異なり、
「もっぱら【文字列値】を扱う」もので、他は関係ありません。

///

Str 関数が一連の質問とどのように関連付けされるのか、質問者さんにしか判らないことのように思います。
VBAの関数やプロパティなどを覚えたい、ということならば、
それぞれの関数やプロパティなどの用途・目的・条件・用法などの基本的な部分は
教本や辞書など(書籍、Webページ、VBAヘルプなど)を頼りに覚えた方がいいです。
質問掲示板は色々な人が色々な意見を書く場所で、良い面も多くありますが、
初歩的なことを学ぼうという人にとっては、一貫性がない、という負の面もあります。

///

VBAを書き上げる力、というか、上達する為の指標、というか、私流儀の紹介になってしまうのかも知れませんが
「何をしたいのか自分に問うて、自分自身に説明してみる」
「目的を明確にして、目的に適した道具(例えば関数やプロパティ)を選ぶ」
「とにかく動くようになるまで書き上げることに集中する」→あらためて検証する。
といった決め事が、息詰った時に私を助けてくれる私のサブルーティンです。

///

大変でしょうけれど、自分を信じてひとうひとつ覚えていくしかありあせん。
頑張ってください。
それでは、また。
    • good
    • 0
この回答へのお礼

了解しました!!!!

お礼日時:2013/04/04 12:19

こんにちは。


どうして文字列に拘るのか?はこの際置いておきます。

>Format(Date, "dd")の数値表記と
>Right("0" & day(Date), 2)の数値表記が
>違うものとして認識されるようです。

どちらも等しく半角2文字の文字列値を返します。
もしも違いが出るとすれば実行するタイミングの問題で
Date関数が返す今日の日付に違いが出る場合(午前零時マタギ)だけです。

【データ型】は等しく文字列型
【値】も2桁の数字からなるまったく同じ文字列です。
もし、結果に相違が出るとすれば、
 セルに出力する時点
または、
 01 と手入力する時点
での
そのセルに設定された【表示形式】が
 本来設定されているべき「文字列」ではなかったり
 正しく設定されていたり
手順のミスが原因です。

#以下の説明は、Excelや多くの表計算アプリでの基本的な仕様に関するものです。
#一旦、VBAのことは忘れて、表計算アプリの基本について理解を深めてください。

どうも誤解があるようですが、
セルには【値】と【表示】に関する色々なプロパティがあります。
同じ様に見えても【値】と【表示】が異なることは一般的にあることです。
また、セルの【値】が
どのような【データ型】で格納されるかを決定するのは2点、
 格納しようとしている【値】の【データ型】と
 事前にセルに設定されている【表示形式】
によって決定されます。

実験用に真っ新なシートを用意して試してみてください。

■a■数値
 A1を選択して、
  Ctrl + 1を押して
  [表示形式]タブを選び
  [分類]の中にある[ユーザー定義]を選び
  [種類]の直下に 00 と入力して
  [OK]を押す
 これで【値】の【データ型】は「数値」
 【表示形式】は2桁の「数字」と設定されます。
 続けてA1に値を設定しますが、
  01 、01 、1 、1
 数式バーに表示されている【値】は 1 。
 セルの【表示】は 01 になります。

■b■文字列
 A2を選択して、
  Ctrl + 1を押して
  [表示形式]タブを選び
  [分類]の中にある[文字列]を選び
  [OK]を押す
 これで【値】の【データ型】は「文字列」
 【表示形式】も「文字列」と設定されます。
 続けてA2に値を設定しますが、
  01 、01 、1 、1
 数式バーに表示されている【値】も セルの【表示】も
 入力した通りの
  01 、01 、1 、1
 になります。

シンプルに、■a■は「数値」■b■は「文字列」です。
見た目は殆ど同じですが、【データ型】が違い、【値】も違います。
ピボットテーブルでもオートフィルターでも
■a■と■b■は区別されます。
リストを見ると、
 ■a■については 1 。
 ■b■については 01 。
この場合は違いが解り易いですよね。

同じ手順で、今度は■a■■b■共に 11 と入力します。

それでもやっぱり、■a■は「数値」■b■は「文字列」です。
見た目は殆ど同じですが、【データ型】が違い、【値】も違います。
ピボットテーブルでもオートフィルターでも
■a■と■b■は区別されます。
リストを見ると、
 ■a■については 11 。
 ■b■については 11 。
同じものが2つあるように錯覚してしまいますね。

とりあえず、以上の説明から、誤解をといて、現状認識を正してください。

その上で、前スレの冒頭にも書きましたが
「数値であれ文字列であれ統一されること」こそ肝要、
つまり、既存のデータには、見た目が殆ど同じで異なる値のものが入り混じっているので、
それらを統一する作業が必要、ということです。
安易に手順やVBAコードを提示するのは、今回はやめておきますね。
手順よりも理解が大事、ですし、解決に必要な情報は提示出来ている筈ですので。

蛇足ですが、
■c■日付
 A3を選択して、
  Ctrl + 1を押して
  [表示形式]タブを選び
  [分類]の中にある[ユーザー定義]を選び
  [種類]の直下に dd と入力して
  [OK]を押す
 これで【値】の【データ型】は「日付」
 【表示形式】は2桁の「数字」と設定されます。
 続けてA1に値を設定しますが、
  2013/4/1
 数式バーに表示されている【値】は 2013/4/1 。
 セルの【表示】は 01 になります。

シンプルに、■a■は「数値」■b■は「文字列」■c■は「日付」です。
見た目は殆ど同じですが、【データ型】が違い、【値】も違います。
ピボットテーブルでもオートフィルターでも
■a■と■b■と■c■は区別されます。
リストを見ると、
 ■a■については 1 。
 ■b■については 01 。
 ■c■については 2013/4/1 。
  日付が並んでいる場合は 2013年 4月 1日 と階層で表示されます。

多くの場合、日付で扱った方が何かと便利だったりするかも知れません(?)。

■d■何がなんでも文字列
 上で【表示形式】を設定したA1:A3、どれでも、
 強制的に文字列にする為には
  '01
 と、先頭に ' を付けてあげるだけです。
 この場合、数式バーに表示されているのは '01 ですが、
  【値】は 01 【表示】も 01 です。
 ピボットテーブルでもオートフィルターでも
 ■d■は■b■と等しく文字列として扱われます。

とりあえず、以上です。

この回答への補足

遅くなりました。
検証はしましたが今回の問題とのつながりがわかってはいません。

TextBox10.Text = Str("01")

としたときにテキストボックスに「01」ではなく「1」と表示される問題でつまづいています。

補足日時:2013/04/02 00:42
    • good
    • 0
この回答へのお礼

凄くて丁寧にありがとうございます

お礼日時:2013/04/02 00:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!