- 締切済み
VBAカレンダーから予定をmsgboxに表示
If Application.CountIf(seets("seet3").Range("i5:i500"), C.Value) > 0 Then 構文の先頭がこれでよいのかも分かりません。教えてください、、、 ("sheet3")のi列5行目から500行まで予定日付、j列5行目から500行まで予定詳細が入力されています。("sheet2")にカレンダーがあり初期化して年/月を呼び出すとその月の予定日と予定詳細がmsgBoxに表示されるようにしたいのです。宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。思い出したので、別の方法を紹介します。 Sheet2に A列 B列 C列 月 年月日 行事 1 2016/1/4 新年会 1 2016/1/5 主要会社年始 1 2016/1/6 A社訪問 1 2016/1/7 立ち合い 1 2016/1/8 あ-1 1 2016/1/9 い-2 ・・・ 以下12月分までデータがあるとします。 A2には関数 =MONTH(B2)を入れて最下行まで式を複写します。 結果は上記A列の通り月数字の数値(1-12)になる。 データのどこかを選択して、CTRL+A (範囲選択) データーフィルタ A列の第1行に、▼が出ているから、クリックして 「すべて選択」のレ点をクリックして、いったんすべて選択を解除 そして、データを見たい月数の四角(チェックボックス)にレ点を入れる OK これで、例えば「6」をクリックしたら、6月分だけがシートに残って(シートの第1行目から)見える。 選択によっては複数月分も同時表示できる。 これを印刷でもして、机の上でゆっくり見たり考えられる。 ーー これぐらいだとVBAを使うこともないと思うが、どうしてもやりたいなら、上記操作をしてマクロの記録を取って修正して、VBA化もできる。 ーー 小生が言いたいのは、VBAなんて言っているが、質問者がまず、エクセル(手操作)でできる機能(メニュー)に、より精通する(精通しなくても一通り勉強してどういうメニューがあり、何ができるのか、頭に入れる)ことだと思う。VBAは、「基本的にエクセルでできる機能しかできない」のだと、心得て勉強すること。その辺が不十分では、エクセルの利用としては、本末転倒と思う。
- imogasi
- ベストアンサー率27% (4737/17069)
前の質問とずいぶん違う質問内容だな。 Application.Countifなどを、質問のまず初めに出しているが、下記処理のほんの一部に過ぎないことだ。質問の説明としてはうまくない。 (1)抜出の条件となる、年月指定のやり方 質問でのSheet2はどういうデータ内容なのか。 日付(月)指定は(A)コンボボックス、(年と月を分けるやり方と分けないやり方)(B)MsgBox、(C)シートの年月セルをクリック(D)カレンダーコントロールなどが考えられる。 (D)を目指しとぃるのか。エクセルのVBA教科書では、そこまで説明されていないことが多い。 ウインドウズソフトでカレンダーなどを見慣れているかもしれないが、初心者には結構むつかしいのだ。 これを使うのは、少し早すぎるだろう。 ーー Application.InputBox(Prompt:="データを入力してください。", Type:=64)では、年月指定がない。 日付はエクセルでは、年+月+日までのものを使う(すなわち日を省けない。)ので、抜出の条件には、1日から月末日までの範囲を指定することになる。 エクセル関数にMonthPart(仮称。年月だけの文字列を作る関数)のようなものはない。 Inputboxで年月を指定させて、その月の1日と月末日で、日付範囲の開始と終了日を作る。 (2)抜出し 予定データのあるSheet3のI5:I500に日付(日付シリアル値とする、文字列なら話が別)、 Sheet3のJ5:JI500に予定内容の文章テキストがあるということだろう。 (2)結果表示 前質問時から、Msgboxでの表示に、こだわっているが、月平均は500/12の1か月あたり50件のようなので,Sheetに表示することを勧める。 別のユーザーフォームに表示など考えられるが、質問者には無理だろう。 こういうように(大げさに言えば)システム設計(やり方や使う道具立て)について、質問者は、エクセルの経験が少ないようで、この処理をこなす域に達してないと思う ましてVBAでやるのは無理で、やるとなると、質問は丸投げで、回答が出た後にいろいろ質問続出なのではないか。 マクロの記録から勉強を始めてはどうか。 ーーー 一例で(マクロの記録ではないが) (1)年月日セットは、Msgbox方法で Sub test01() d = InputBox("年/月") df = DateValue(d & "/01") dt = DateValue(d & "/31") MsgBox "期間は" & Format(df, "yyyy年mm月dd日") & Format(dt, "yyyy年mm月dd日") & "まで" Worksheets("Sheet3").Range("A1") = df Worksheets("Sheet3").Range("B1") = dt End Sub 上記は、月末はいつも31日だが月末日をセットする方法はありますが略。別途学んでください。 これを手入力すして、下記(2)のフィルタを実行する方法もある。 (2)フィルタ Sub test03() With Worksheets("Sheet2") Range("A1:A500").AutoFilter Field:=1, Criteria1:=">" & Range("A1") Range("A1:A500").AutoFilter Field:=1, Criteria1:="<" & Range("B1") End With End Sub シート画面で 開発ーマクローTest03ーオプションーCtrl+Dー実行 その後の実行はCTRLキーとDを同時に押すとフィルタされる。 (コマンドボタンクリックで実行方式は、今の質問者には過ぎたことと思いこちらにを紹介する。) マクロの記録を取ると出てくるコードがもとです。 Sheet3自身に結果が出る。他シートに出すのは少しむつかしい。 参照 http://www.moug.net/tech/exopr/0040016.html この操作をしてマクロの記録を取って、考えるしかないだろう。 これでまずは辛抱することだ。 後は操作方法の文章をシートに入れて、使いやすくすること。 参照 作製参照済みのマクロにショートカットキーを設定する http://www.officepro.jp/excelmacro/run/index1.html の後半
お礼
ありがとうございました。勉強します。
お礼
有難うございます、
補足
下記が私の使っている構文ですがForEach H のRange iと隣のjのデータをMSGBoxに表示させたいのです、宜しくお願いします。 Sub calendar_month12() Dim myDate As String Dim Nen As Integer, Tuki As Integer Dim i As Integer, j As Long, k As Integer Dim cn As Long Dim myTitleD, myTitle(1 To 1, 1 To 7) Dim myTable(1 To 6, 1 To 7) Dim c As Range Dim e As Range Dim f As Range myDate = Application.InputBox(Title:="年月の指定", _ Prompt:="年月を 2016/1 の形式で入力してください", _ Default:="2016/1", Type:=2) Nen = Year(myDate) Tuki = Month(myDate) myTitleD = Array("日", "月", "火", "水", "木", "金", "土") For k = 0 To 6 myTitle(1, k + 1) = myTitleD(k) Next k cn = 1 For j = DateSerial(Nen, Tuki, 1) To DateSerial(Nen, Tuki + 1, 0) If Day(j) <> 1 And Weekday(j) = 1 Then cn = cn + 1 myTable(cn, Weekday(j)) = Format(j, "yyyy/m/d") Next j Application.ScreenUpdating = False Range("A:H").Clear Range("B1").Value = DateSerial(Nen, Tuki, 1) Range("B2").Resize(1, 7).Value = myTitle Range("B3").Resize(6, 7).Value = myTable Range("B1").NumberFormatLocal = "yyyy""年""m""""" Range("B2").Resize(7, 7).HorizontalAlignment = xlCenter Range("B3").Resize(6, 7).NumberFormatLocal = "d" Range("B2").Resize(6, 1).Font.Color = RGB(255, 0, 0) Range("B7").Resize(6, 1).Font.Color = RGB(255, 0, 0) Range("C2").Resize(6, 1).Font.Color = RGB(0, 255, 0) Range("H2").Resize(6, 1).Font.Color = RGB(0, 0, 255) For Each c In Range("B3").Resize(6, 7) If Application.CountIf(Sheets("予定入力画面").Range("B5:B500"), c.Value) > 0 Then c.Font.Color = RGB(0, 255, 0) c.Font.Size = 30 End If Next c For Each e In Range("B3").Resize(6, 7) If Application.CountIf(Sheets("予定入力画面").Range("C5:C500"), e.Value) > 0 Then e.Font.Bold = True e.Font.Size = 16 End If Next e For Each f In Range("B3").Resize(6, 7) If Application.CountIf(Sheets("予定入力画面").Range("E5:E500"), f.Value) > 0 Then f.Font.Color = RGB(0, 0, 0) f.Font.Bold = True f.Font.Size = 30 End If Next f For Each G In Range("B3").Resize(6, 7) If Application.CountIf(Sheets("予定入力画面").Range("G5:G500"), G.Value) > 0 Then G.Font.Color = RGB(0, 255, 0) G.Font.Bold = True G.Font.Size = 30 End If Next G For Each H In Range("B3").Resize(6, 7) If Application.CountIf(Sheets("予定入力画面").Range("I5:I500"), H.Value) > 0 Then H.Font.Color = RGB(255, 0, 0) H.Font.Size = 30 End If Next H Application.ScreenUpdating = True End Sub