外出自粛中でも楽しく過ごす!QAまとめ>>

 プログラム初心者です。VBAなのですが、エクセルから取得してきたある月の日数分だけの日付をコンボボックスに追加したいのですが、どうしたらいいでしょうか?
 
 その月の末日をmatsuとしていろいろ考えてみましたが、どうもわかりませんでした。
matsu=Day(DateSerial(年,月,1)  ←年と月は可変です。
これを工夫してある月の末日を取得したと考えています。これを

For i = 1 To matsu
cmbNyu.AddItem (i & "日")
cmbTai.AddItem (i & "日")
Next i
でコンボボックスに追加・・・とうゆう予定なのですが・・・?この方法じゃなくてもいいので何か方法がありましたらどんなことでもいいのでお力をお貸しください。よろしくお願いします。 

A 回答 (3件)

その月の月末日を取得するのですよね。



エクセルから取得する月を基に

 DateAdd("d",-1,(DateAdd("m",+1,Format$(月,"mm"))))

月から取得する月数の翌月を求めDateAddとFormat$で翌月を求めれば日付は1が帰ってくるはずですからその日付から1日引いた日付がその月の月末日。

これではどうでしょうか。
    • good
    • 0
この回答へのお礼

 有難うございます。DateAdd関数とゆうものの使い方がわからないので、それを調べてからすこし考えてみたいと思います。回答をお待ちしている間、私なりに考えてみたのですが、
matsu = day(DateSerial(year(now),month(now)+1,0))
こんな感じで・・・(^_^;)

 社内システムの出勤管理システムを任されたものの、大学も文系のため全くプログラム初心者で今年の4月までプログラムのプも知らなかったもので・・・
 O_cyanさんの考えていただいたコードを使わしていただこうかと思います。
 また、何かありましたらよろしくお願いいたします。

お礼日時:2002/06/24 13:13

ある月の翌月の0日がある月の末日になります。


(DateSerialの月に13や日に0をセットできます。)

Sub matuCalc()
  Dim 年 As Integer
  Dim 月 As Integer
  Dim matsu As Integer

  年 = Year(Now())
  月 = Month(Now())

  matsu = Day(DateSerial(年, 月 + 1, 0))

  MsgBox matsu
End Sub
    • good
    • 0
この回答へのお礼

有難うございました。私もその方法を思いつき、試してみました。できそうだたので、これでいきたいと思います。またお世話になるかと思いますのでよろしくお願いします。

お礼日時:2002/06/24 21:36

>お礼のmatsu = day(DateSerial(year(now),month(now)+1,0))のところが正しいのかなと気になって、私もやって見ました。


下記がご参考になれば。
Sub test01()
' MsgBox Now()
' MsgBox Year(Now())
' m=Month(Now()) + 1
' MsgBox m
' MsgBox DateSerial(2002, 7, 1)
m = Month(Now())
' m = 12
If m = 12 Then
m = 1
y = Year(Now()) + 1
Else
m = Month(Now()) + 1
y = Year(Now())
End If
a = DateSerial(y, m, 1)
MsgBox a
MsgBox DateValue(a - 1) '月末日
MsgBox Day(DateValue(a - 1))
End Sub
注釈の’を適当に外して確認してください。
    • good
    • 0
この回答へのお礼

有難うございます。ですが、初心者のため注釈の'のどれを外せばいいのかわからなくてメッセージボックスが出てきませんでした。すいません・・・
matsu = day(DateSerial(year(now),month(now)+1,0))
でなんとかできているような感じでしたので、理解できたこれでいこうかなと思うのですが・・・間違ってますか?間違ってたらこのシステムを納めて間もなく社員からいろいろ言われるんでしょうね(^_^;)
バグ処理に追われそうです。有難うございました。

お礼日時:2002/06/24 21:05

お探しの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行"ということは、
日付型の値で、「日にちのみ」が表示さ...続きを読む

QVBA コンボボックスの表示(日付)について

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

Aベストアンサー

私の方が勉強が足りないのかもしれないが
色々書きましたが、結論は、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日になるが私には説明できない。)

私の方が勉強が足りないのかもしれないが
色々書きましたが、結論は、DateValue関数を使えばよいのではないですか。
(1)VBAとあるから、エクセルVBAかアクセスVBAでしょうね
(2)コンボボックスは、設定したアイテムの中から選ぶのが基本だと思うが、本件ではテキスト部へ日付を入力するということですか。
(コンボでアイテムを選択するのは、日付は適さないととおもう。
年、月、日と3段構えになってしまう。質問はそのようには書いてない。)テキストボックスでよいのではと別途疑問は持つ。
(3...続きを読む

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

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

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

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

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

Aベストアンサー

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

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

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

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....続きを読む

QExcelVBA コンボボックスに入力があったらリンクしてテキストボックスを更新したい

フォームで入力画面をつくっています。
あるコンボボックスのリストから項目が選択されたら、一覧からリンクさせてテキストボックスの内容を更新がしたいのです。
例えば「社員コード」のコンボボックスで「3」が選択されたら、「社員名」のテキストボックスに別シートに作成してある社員一覧から「太郎」が表示されるというようにです。

セルA1とコンボボックスをリンクさせ、セルB1にVLOOKUP(A1,一覧,2)で一覧から名前を抽出しました。コンボボックスのChangeイベントでB1の内容をテキストボックスへ送っているのですが、カーソルを別の項目へ移動するまではテキストボックスの内容が更新されません。
コンボボックスのリストを選択した時点でテキストボックスを更新する方法はないでしょうか?

Aベストアンサー

こんばんは。

今は、Form というのは、UserForm のことだと思います。Excelには、フォームツールもありますが、レガシーツールですから、割愛します。

>セルA1とコンボボックスをリンクさせ、セルB1にVLOOKUP(A1,一覧,2)で一覧から名前を抽出しました。
UserForm で、なぜ、ComboBox で、A1 にリンクさせるのでしょうか?
リンクというのは、ControlSource のことだと思います。それでは、出来ませんね。
Change イベントに組み込まないといけません。そのような方法をしなくても可能です。

'-------------------------------------------
たとえば、ワークシートのセルに社員コードと社員名を入れたもの書かれてあるとします。
次に、ComboBox のプロバティの「RowSource」に少なくとも、2列を登録します。

なお、ComboBoxは、2列も入れることが可能です。
ColumnCount | 2 ,ColumnWidth | 20 pt; 20 pt (pt は省略可)のようにすることが可能です。

そうして、以下のようにすれば、テキストボックスに出てくるはずです。

 .ListIndex + 1 と+1しているのは、初期値が -1 で、最初が、0 からだからです。

'-------------------------------------------
Private Sub ComboBox1_Change()
Dim ret As Variant
  With ComboBox1
  ret = Application.VLookup(.ListIndex + 1, ActiveSheet.Range(.RowSource), 2)
  If Not IsError(ret) Then
   TextBox1.Value = ret
  End If
  End With
End Sub
'-------------------------------------------
ActiveSheet よりも、Worksheets(____) と入れたほうがよいです。

こんばんは。

今は、Form というのは、UserForm のことだと思います。Excelには、フォームツールもありますが、レガシーツールですから、割愛します。

>セルA1とコンボボックスをリンクさせ、セルB1にVLOOKUP(A1,一覧,2)で一覧から名前を抽出しました。
UserForm で、なぜ、ComboBox で、A1 にリンクさせるのでしょうか?
リンクというのは、ControlSource のことだと思います。それでは、出来ませんね。
Change イベントに組み込まないといけません。そのような方法をしなくても可能です。

'--------...続きを読む

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

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

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

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

Aベストアンサー

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


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

人気Q&Aランキング