Access VBA質問箱 IV

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

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


6149 / 9994 ←次へ | 前へ→

【7053】Re:フォームからコンボボックスを使用した...
回答  小僧  - 06/1/11(水) 11:02 -

引用なし
パスワード
   まず、Left関数等の戻り値についてです。

Sub test1()
Dim a As Long
  a = 12345
  Debug.Print VarType(Left(a, 2))
End Sub

上記コードを実行すると、イミディエトウィンドウに 8 が返ると思います。
(8 は文字列型という意味です。詳しくはVarTypeのヘルプを参照して下さい。)

12345 という数値の上 2桁を切り取ると、数値型→文字列型に変換されます。

Left(日付型,4) の返り値は2005 という値であっても
数値型でなく、文字列型として扱われています。

-----------------------------------------------------------------------

もう1点、VBA上で暗黙の型変換が行われてしまう事です。

Sub test2()
Dim a As String
Dim b As String
Dim c As Long
Dim d As Long

  a = "2"
  b = "5"
  c = 2
  d = 5
  
  Debug.Print "A:" & a + b
  Debug.Print "B:" & a * b
  Debug.Print "C:" & c + d
  Debug.Print "D:" & c * d
End Sub

A の結果は文字列型の「2」「5」を足しているので「25」
(通常は文字列型の連結には「&」を使いますが…)

C、Dの結果は普通の数値型の計算なので「7」「10」

B の結果は文字列型同士は掛け算出来ないため、
暗黙の型変換が行われ数値型と同じ結果を返しています。

------------------------------------------------------------------------
以上の2点から、

Left(日付型,4) = '2005'
Left(日付型,4) = 2005

どちらの場合でも VBA 上は同じ様に解釈してくれる、という事になります。

ですが「VBAが勝手に判断してくれるから大丈夫」と過信してコードを作成するのは危険ですので、

Left(日付型,4) = '2005'
CLng(Left(日付型,4)) = 2005

のように出来る限りデータ型については意識された方が無難だと思います。


-------------------------------------------------------------------------

蛇足になりますが、日付型の表記は OS の設定依存です。

わん さん もWindows を使用されていると思われますが、

コントロールパネル → [地域と言語のオプション] → [カスタマイズ] →
[日付] タブに [短い日付の形式] という欄があると思います。

上の方にあるカレンダーの種類を西暦(英語)にすると、
この [短い日付の形式] に mm/dd/yyyy などが選べる様になります。

(日本では馴染みがありませんが、英語圏ですとこの表記が標準の模様です。)

こちらの設定によっては、Left(日付型,4) が 2005 を返さずに
01/1 を返してしまう恐れも出てきてしまいます。
Left関数 を使用するよりも、Year関数の方が無難かもしれません。

(Year関数は西暦でなくグレゴリオ暦を使うと狂ってしまいますが(笑))

2,662 hits

【7038】フォームからコンボボックスを使用した検... わん 06/1/9(月) 20:00 質問
【7039】Re:フォームからコンボボックスを使用した... よろずや 06/1/9(月) 22:39 発言
【7041】Re:フォームからコンボボックスを使用した... 小僧 06/1/9(月) 23:28 回答
【7042】Re:フォームからコンボボックスを使用した... わん 06/1/10(火) 1:09 質問
【7045】Re:フォームからコンボボックスを使用した... 小僧 06/1/10(火) 11:15 発言
【7048】Re:フォームからコンボボックスを使用した... わん 06/1/11(水) 4:49 発言
【7049】Re:ヘルプで「抽出条件の指定」 たん 06/1/11(水) 8:18 回答
【7067】Re:ヘルプで「抽出条件の指定」 わん 06/1/11(水) 13:05 質問
【7073】Re:ヘルプで「抽出条件の指定」 たん 06/1/11(水) 14:13 回答
【7075】Re:ヘルプで「抽出条件の指定」 わん 06/1/11(水) 14:34 お礼
【7076】Re:何が分からない? たん 06/1/11(水) 14:54 回答
【7077】Re:何が分からない? たん 06/1/11(水) 15:00 回答
【7078】Re:何が分からない? なるほど・・・、 06/1/11(水) 15:08 お礼
【7079】Re:書く欄を間違えました。 わん 06/1/11(水) 15:15 発言
【7051】Re:フォームからコンボボックスを使用した... 小僧 06/1/11(水) 10:11 回答
【7057】Re:フォームからコンボボックスを使用した... わん 06/1/11(水) 11:47 質問
【7052】Re:ヘルプで「クォーテーション」 たん 06/1/11(水) 10:38 回答
【7056】Re:ヘルプで「クォーテーション」 わん 06/1/11(水) 11:42 質問
【7059】Re:ヘルプで「クォーテーション」 たん 06/1/11(水) 11:56 回答
【7063】Re:ヘルプで「クォーテーション」 わん 06/1/11(水) 12:10 お礼
【7053】Re:フォームからコンボボックスを使用した... 小僧 06/1/11(水) 11:02 回答
【7061】Re:フォームからコンボボックスを使用した... わん 06/1/11(水) 12:00 質問
【7069】Re:無理矢理1個で処理させようとしない たん 06/1/11(水) 13:20 回答
【7071】Re:補足 たん 06/1/11(水) 13:32 回答
【7072】Re:一気に飛びすぎて・・・ わん 06/1/11(水) 13:55 発言
【7062】Re:余談 たん 06/1/11(水) 12:01 発言
【7068】Re:フォームからコンボボックスを使用した... わん 06/1/11(水) 13:15 発言
【7080】Re:フォームからコンボボックスを使用した... 小僧 06/1/11(水) 15:15 回答
【7081】Re:フォームからコンボボックスを使用した... わん 06/1/11(水) 15:53 お礼
【7085】Re:フォームからコンボボックスを使用した... わん 06/1/11(水) 17:17 質問
【7093】Re:フォームからコンボボックスを使用した... 小僧 06/1/12(木) 8:59 発言
【7094】Re:フォームからコンボボックスを使用した... わん 06/1/12(木) 11:05 お礼

6149 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078229
(SS)C-BOARD v3.8 is Free