プロが教えるわが家の防犯対策術!

ComboBox1のIMEModeプロパティが0-fmIME MODE NOControlに設定されています。そして、下記コードを作成しました。
Private Sub ComboBox1_Change()
ComboBox1 = Format(ComboBox1, "m月d日")
End Sub
このコンボボックスに例えば、8/30と入力すると「8月3日0」と表示されてしまいます。
これを8月30日と表示するにはどうすれば良いのでしょうか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

私の方が勉強が足りないのかもしれないが


色々書きましたが、結論は、DateValue関数を使えばよいのではないですか。
(1)VBAとあるから、エクセルVBAかアクセスVBAでしょうね
(2)コンボボックスは、設定したアイテムの中から選ぶのが基本だと思うが、本件ではテキスト部へ日付を入力するということですか。
(コンボでアイテムを選択するのは、日付は適さないととおもう。
年、月、日と3段構えになってしまう。質問はそのようには書いてない。)テキストボックスでよいのではと別途疑問は持つ。
(3)フォーマットでm月d日を適用できるのは、エクセルの場合は元が日付セリアル値でなければならないはず。
一方コンボやテキストボックスの返り値は、入力した場合は文字列ではないですか。
これにFormatを適用しても、ダメではないですか。
エクセルでは書式はNumberFormatといい、Numberデータを中心に
書式を設定することが明確に言われている。文字列データへの
書式設定はほとんど無い。
ただエクセルでは、入力した文字列数字データを強制的に数値化したりする力が強いので、わかりにくい例がある。
(4)Cells(2, 1) = DateValue(UserForm1.ComboBox1.Value)
としますと、8/13とコンボのテキスト部に入力したデータが、A1セルに2007/8/13の日付シリアル値で入りました。
これが解決策では無いですか。書式はセルに別途適応する。
Sub test02()
Cells(7, 1).NumberFormat = "m月d日"
End Sub
ーー
エクセルでは、日付を文字列にしてセルにセットするのは、限られた場面で、日付計算・多彩な書式設定に利用できず、有害の方が多い。
ーー
http://park5.wakwak.com/~weblab/refFormat.html
VB.NETでは、Format関数は、文字列を数値に変換しません。
とあるところを見ると、以前は数値化していた?。
すると8/30は30分の8に似られる?
ーー
エクセルVBAで
Cells(3, 1) = Format(8 / 30, "m月d日")
Cells(3, 1) = Format("8 / 30", "m月d日")
はいずれも書式設定(m月d日)した文字列にならない。
書式は別途セルに書式設定しないといけない。
文字列でVBAで入れると、エクセルの強力な日付転換機能が働き
書式なし、または設定済みの日付書式の日付になるよう。
(Cells(3, 1) = Format(8 / 30, "m月d日")は12月30日になるが私には説明できない。)

この回答への補足

ご回答ありがとうございます。
>(1)VBAとあるから、エクセルVBAかアクセスVBAでしょうね
エクセルVBAです。
>(2)コンボボックスは、設定したアイテムの中から選ぶのが基本だと思うが、本件ではテキスト部へ日付を入力するということですか。
はい、そうです。
私の質問の仕方が悪かったようです。
>このコンボボックスに例えば、8/30と入力すると「8月3日0」と表示されてしまいます。
コンボボックス自体の四角の中に「8月3日0」と表示されるということです。

補足日時:2007/08/14 18:42
    • good
    • 0

Changeイベントでの変更よりKeyDownイベントで変更したほうがよくありませんか


Private Sub KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  if KeyCode = vbKeyReturn then
    ComboBox1.text = Format( ComboBox1.Text, "m月d日")
  end if
End Sub
といった具合で Enterキーが押されたらコンボボックスの内容を変更するようにします

Changeイベントだけでの対応なら
8 を入力すると 1月7日の表示になります
8/30を続けて入力
1月7日部分を選択してDelキーを押す
といった操作をすれば 『8月30日』と表示されます
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
勉強になりました。

お礼日時:2007/08/14 18:41

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qコンボボックスに日付を表示する

現在、VB.netを勉強中です。

コンボボックス内に今日から一週間分の日付を表示したいのですが、上手く行きません。

Dim dtToday As DateTime = DateTime.Today

ComboBox1.Items.Add(dtToday.ToString())

と書いたところ現在の日付を取得しコンボボックス内に
2013/5/28 00:00 と表示されています。

これを時刻を表示させず(2013/5/28 のみ表示)、For文を用いて一週間分表示させたのですが、どのようにすればよいでしょうか?

分かる方がいれば、よろしくお願いします。

Aベストアンサー

Dim dtToday As DateTime = DateTime.Today

For i As Integer = 0 To 6
ComboBox1.Items.Add(dtToday.AddDays(i).ToString("yyyy/M/d"))
Next

こんな感じかな?

QEXCEL VBAのコンボボックスで日だけを表示する方法

EXCELのVBAを使って経費の打ち込みをするマクロを作っています
その中で、コンボボックスで日付を選択するようにしました
コンボボックスに表示する日付はセルから「RowSource」で取り出しました
セルの日付の入力形式は「2008/10/1」です
そのセルの書式設定で表示形式を「ユーザー定義で d (日だけ表示)」としています
なので、コンボボックスで選択して表示する際も日だけを表示したいのですがうまくいきません
ComboBox1 = Format(ComboBox1, "d")
とすると、コンボボックス内で数字がちらちらしてランダムに数字が表示されてしまいます
ComboBox1 = Format(ComboBox1, "m月d日")
この形だと、きちんと「10月1日」の様に表示されます

Private Sub UserForm_Initialize()

With ComboBox1
.RowSource = "sheet1!A1:A5" '日付のセル

End With
End Sub

Private Sub ComboBox1_Change()
ComboBox1 = Format(ComboBox1, "m月d日")
End Sub

日だけを表示する方法をご教授ください

EXCELのVBAを使って経費の打ち込みをするマクロを作っています
その中で、コンボボックスで日付を選択するようにしました
コンボボックスに表示する日付はセルから「RowSource」で取り出しました
セルの日付の入力形式は「2008/10/1」です
そのセルの書式設定で表示形式を「ユーザー定義で d (日だけ表示)」としています
なので、コンボボックスで選択して表示する際も日だけを表示したいのですがうまくいきません
ComboBox1 = Format(ComboBox1, "d")
とすると、コンボボックス内で数字がちらちらしてラン...続きを読む

Aベストアンサー

こんにちは、#4です。
ご丁寧なレスをどうも。

えーと、、、
ComboBox から シリアル値を返す必要はないようですね。

〉別解2ですが、5行だとうまくいくのですが、知識不足で、一月分の31行にするときにどこを変更すればよいか分からず31行では試せませんでした…
〉この方法も面白いので試してみたいと思うのですが。
〉ちなみに、表示される日付は2008/9/1の形から9月1日等の表示に変えることができるのでしょうか?

"一月分の31行"ということは、
日付型の値で、「日にちのみ」が表示されたセルが、
月の初め(1日)から末日まで、連続(欠落なく)して
A5:A35(または、A5:A32、A5:A34)の範囲にある、
ということですよね?

◆別解2、改、
ComboBox1 のリストを2列にして、
選択するリストの表示は「m 月 d 日」、
選択後の.Value(.Text)は「日にちのみ」にする
(※シリアル値が必要な場合は、合成することになります)
(一応、締め日がズレても[26日から翌25日とか]対応する筈です)

Private Sub UserForm_Initialize()
Dim vA
Dim i As Integer
Dim dpm

' ' 当月の日数を求める
dpm = Worksheets("Sheet1").Range("A5").Value
dpm = Day(DateSerial(Year(dpm), Month(dpm) + 1, 1) - 1)

' ' A5から下へ当月の日数分の範囲の値をバリアント型の変数vAに格納(内部的にDate型)
 vA = Worksheets("Sheet1").Range("A5:A" & dpm + 4).Value

' ' vAを一括で String型の「m 月 d 日」に変換(ワークシート関数のTEXTを使用)
 vA = Application.Text(vA, "m"" 月 ""d"" 日""")

ReDim Preserve vA(1 To dpm, 1 To 2)
For i = 1 To dpm
 vA(i, 2) = Day(vA(i, 1))
' ' vA(i, 2) = i ' でいいのかも? 
Next i

ComboBox1.List = vA
ComboBox1.TextColumn = 2

End Sub

一応、お尋ねの答えとしては、上のようになります。
(A列に誤(未)入力がある場合をケアしていません。)

1ヶ月分の日付を文字列にしたもの(「日にちのみ」と「m 月 d 日」)をリストにするのなら、
セル範囲にある日付を追いかけなくてもいいような気もしますね(^^;)。

◆別解2、改、改、
わざわざ書くほどでもありませんけど、、、
(こちらは、1日から末日、専用)

Private Sub UserForm_Initialize()
Dim dpm
Dim m As Long
Dim vA
Dim i As Integer
dpm = Worksheets("Sheet1").Range("A5").Value
m = Month(dpm)
dpm = Day(DateSerial(Year(dpm), m + 1, 1) - 1)
ReDim vA(1 To dpm, 1 To 2)
For i = 1 To dpm
vA(i, 1) = m & " 月 " & i & " 日 "
vA(i, 2) = i
Next i
ComboBox1.List = vA
ComboBox1.TextColumn = 2
End Sub


それでは、また

参考URL:http://www.clayhouse.jp/array/array.htm

こんにちは、#4です。
ご丁寧なレスをどうも。

えーと、、、
ComboBox から シリアル値を返す必要はないようですね。

〉別解2ですが、5行だとうまくいくのですが、知識不足で、一月分の31行にするときにどこを変更すればよいか分からず31行では試せませんでした…
〉この方法も面白いので試してみたいと思うのですが。
〉ちなみに、表示される日付は2008/9/1の形から9月1日等の表示に変えることができるのでしょうか?

"一月分の31行"ということは、
日付型の値で、「日にちのみ」が表示さ...続きを読む

QエクセルVBA ユーザーフォームのTextBoxを日付にしたい

いつもいつも 皆様からのお返事を心待ちにしておりますNannyです。

VBAのユーザーフォームでTextBoxを日付専用入力にしたいのです。

で、入力方法が 20050219 というような形で入力して、2005/02/19という形か、平成17年2月19日というような形に持って行って、セルに貼り付けしたいのです。

出来なさそうな予感満載なのですが、皆様お返事の程宜しくお願い致します。
(出来ないのであればあきらめられるので、出来るかどうかのお返事も期待しております。

宜しくお願い致します。

Aベストアンサー

下記はTextBox1に20050219としCommandButton1をクリックするとシート1のA1に2005/2/19と出力します。
Private Sub CommandButton1_Click()
Worksheets(1).Range("A1").Value = Format(TextBox1.Text, "0000""/""00""/""00")

End Sub

QVBA コンボボックスで選んだ値を取得するには

ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。

コンボボックスのコードで
Private Sub ComboBox1_Change()
moji1 = ComboBox1.Text
Range("A1").Value = moji1
のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。

マクロ1にて、上記と同じ
Range("A1").Value = moji1
というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。

原因をご存知の方はお教えください。

Aベストアンサー

原因については下記を参考にしてください。
http://pc.nikkeibp.co.jp/pc21/special/2007_gosa/eg5.shtml

QVBAでシートからコンボボックスにデータを設定する方法

VBAにてフォーム起動時にシート内に設定した
値をコンボボックスに取り込みたいのですが・・。
たとえばA列に連続で入力されているデータを
取り込むなど・・。
設定データ数は動的に変化します。

Aベストアンサー

もうほとんど同じですが…

Private Sub UserForm_Initialize()
Dim i As Integer

 ComboBox1.Clear
 For i = 1 To Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  ComboBox1.AddItem Worksheets("sheet1").Cells(i, 1).Value
 Next
End Sub

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QExcel VBA コンボボックスの初期値の設定について

いつもお世話になっています。
Excel VBA コンボボックスの初期値の設定について教えてください。
ユーザーフォームを表示させた時、そこにあるコンボボックスには何も表示されていません。
コンボボックスのボタンを押すとちゃんと
「アジア」「ヨーロッパ」「アメリカ」等の語群が表示されます。

ユーザーフォームを表示させた時点でコンボボックスに「アジア」を表示させるにはどうすればいいか教えてください。
よろしくお願いします。

Aベストアンサー

UserForm Initialize
ComboBox1.Text = ComboBox1.List(0)

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QexcelVBA コンボボックスに時刻で表示したい

いつもお世話になります。お知恵を貸してください。
ユーザーフォームにコンボボックスがあります。
リストの中身はプロパティウィンドウのRowSourceでSheetにある時間表を指定しています。
そのリストは7:00,7:30,8:00…と時刻をh:mmで表示してあります。
コンボボックスには7:00と表示されているのですが、実際選ぶとシリアル値で表示されてしまいます。
[終了時間]-[開始時間]の計算もしたいので、シリアル値は必要だと思いますが、表示はh:mmで表示する方法を教えてください。
よろしくお願いします。

Aベストアンサー

ついでに、入力チェックや入力補助機能なども含めたサンプル。

1. フォームに ComboBox1、CommandButton1 を配置する
2. Sheet1のA1:A20に RowSource に設定するデータを入力する
3. 以下のソースをフォームにペーストにテスト

Option Explicit

' // フォームを閉じる場合のフラグ
Private m_fFormClose As Boolean

' // Userform が初期化される時実行されるイベント
'
Private Sub UserForm_Initialize()
  
  With Me.ComboBox1
    .List = Application.Text(Range("Sheet1!A1:A20").Value, "h:mm")
    ' IME を無効化し全角文字などが入力されないようにする
    .IMEMode = fmIMEModeDisable
    ' 最大5文字までしか入力できなくする
    .MaxLength = 5
  End With

End Sub

' // Userform を閉じる時実行されるイベント
'
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  m_fFormClose = True
End Sub

' // ComboBox がフォーカスを失うとき実行されるイベント
'
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  
  ' フォームを閉じるフラグが立っている場合、即終了
  If m_fFormClose Then Exit Sub
  
  Dim s As String
  s = Trim$(ComboBox1.Text)
  If Len(s) Then
    ' 時刻以外が入力されたらフォーカス遷移をキャンセルさせる
    Cancel = Not IsTime(s)
  End If

End Sub

' // ComboBox キーが押されたとき実行されるイベント
' // ANSI コードまたはシフト JIS コードに対応する文字キーで発生
'
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  
  ' 時刻入力のため以外のキー入力以外は無効化する
  If Not Chr(KeyAscii) Like "[0-9:]" Then
    KeyAscii = 0
  End If
  
End Sub

' // ComboBox キーが押されれ、キーを離したとき実行されるイベント
'
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  
  ' 以下は ComboBox のマッチング機能を利用し、「:」記号の入力を
  ' スキップさせる入力補助を行う
  
  If KeyCode <> vbKeyBack Then ' BackSpace キーは除外
    If Me.ComboBox1.SelText Like ":*" Then
      Me.ComboBox1.SelStart = Me.ComboBox1.SelStart + 1
      Me.ComboBox1.SelLength = 2
    End If
  End If
  
End Sub

' // CommandButton をクリックしたとき実行されるイベント
'
Private Sub CommandButton1_Click()
  ' C1 セルへ記入
  With Cells(1, "C")
    .NumberFormat = "h:mm"
    .Value = CDate(Me.ComboBox1.Value)
  End With
End Sub

' // 内部チェック関数-時刻書式
'
Private Function IsTime(ByVal s As String) As Boolean
  
  If IsDate(s) And (s Like "#:##" Or s Like "##:##") Then
    IsTime = True
  Else
    MsgBox "時刻を入力して下さい", vbCritical
  End If

End Function

ついでに、入力チェックや入力補助機能なども含めたサンプル。

1. フォームに ComboBox1、CommandButton1 を配置する
2. Sheet1のA1:A20に RowSource に設定するデータを入力する
3. 以下のソースをフォームにペーストにテスト

Option Explicit

' // フォームを閉じる場合のフラグ
Private m_fFormClose As Boolean

' // Userform が初期化される時実行されるイベント
'
Private Sub UserForm_Initialize()
  
  With Me.ComboBox1
    .List = Application.Text(Range("Sheet1!A1...続きを読む

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング