- ベストアンサー
エクセルVBAで
1週間分のスケジュールをシートにセットするための入力フォームを作りました。 大まかには、◎年◎月◎週目と選択すると該当日(月~日)が表示され、各日に対するスケジュールを入力します。 『Cmdデータセット』と言うコマンドボタンをクリックすると該当シートにそのデータが反映されます。 シートは月間スケジュールと週間スケジュールに分かれていて、 コマンドボタンをクリックすると月間・週間のそれぞれ該当シートにデータを反映させます。・・・と言うものです。 週間スケジュールについては問題ないのですが、月間スケジュールで行き詰まってしまっています。 助けていただきたいのは・・・ 現在は”19年10月5週目”を選択していたら10月のシートを見るように設定してあります。 基本的にはこれで問題ないのですが、 例えば実際に”19年10月5週目”を選択したとします。 すると、10月29日~11月4日の日付が表示されます。 そのため、この状態だと10月1日~4日と10月29日~31日にデータが反映されてしまいます。 10月29日~31日分は10月のシートを見る(selectする)ように、11月1日~4日分は11月のシートを見る(selectする)ようにしたいのです。 月をまたがない場合は日付は必ず昇順となります。 日付が昇順の場合は現状通り選択した月のシートをselectし、 そうでない場合は1桁の数字(あるいは1~6)の分のみ 次(右隣)の月のシートをselect(ActiveSheet.Next.Select?)させたいのですが可能でしょうか? イメージとしてはselect文を条件式、「どのセルにどのスケジュールをセットするか」を実行する処理としてloopを使えたら。という感じなのですが。 VBAを独学で進めている上にまだまだ未熟のため、 馬鹿げていたりありえない話をしてしまっているかもしれませんが、何卒よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 うん、だいたいイメージつかめますよ~。整理すると (1)年・月・週目を入力する。 (2)すると、7日分の日付が表示され、その横に入力欄が出てくる。 (3)データ入力後「Cmdデータセット」ボタンをクリックで、週/月データの該当部分のセルにデータが登録される。 という感じでしょうか。 「Cmdデータセット」がクリックされた場合 (1)表示されている7つの日付を順番に読み込む。 (2)読み込むごとに、その日付を月と日に分解する。 で、月データのシート名を(2)で読み込んだ「月」から合成する仕組みにしておけば、「その週が月をまたぐかどうか」の心配をする必要は無いですよね。 すなわち、「次の月のシート」という概念は ちょっと置いていただいて、 ・「月」から「どのシートに書き込むのか(シート名)」を指定し、 ・「日」から「シートのどの位置(日付)に書き込むのかを指定する という考え方でいけば、よりうまく行くのでは?と思います。 なにか追加でわからないことがあれば、お気軽にご質問どうぞ(ただしお返事は明日の晩になってしまいますが(泣))。
その他の回答 (1)
- papayuka
- ベストアンサー率45% (1388/3066)
正直言ってご質問を読んでも意味が解りませんでした。 「コマンドボタン」等の用語が出ていますが、これらが置かれる場所(シート上なのかUserFormなのか)によっても記述が変わりますし、シート名がどうなっているか等も影響します。 状況を見ることが出来ない回答者の立場に立って、回答者の環境で再現出来る情報(シート名やセルの番地、データの状況、記述中のマクロコードなど)を網羅し、且つ、もう少し内容を絞って質問された方が良いかも知れません。 ちなみにシート名が 1月 ~ 12月 の12枚のシートがある場合、下記のマクロを実行して日付を入力すると 2007/10/1 ~ 2007/11/4 までは「10月」 2007/11/5 ~ 2007/12/2 までは「11月」 2007/12/3 ~ 2008/1/6 までは「12月」 のシートをそれぞれ選択します。 以上、ご参考まで。 Sub Test() myDate = Application.InputBox("年月日を入力", "日付", Type:=2) If Not IsDate(myDate) Then Exit Sub cnt = Weekday(myDate, vbMonday) myMon = DateSerial(Year(myDate), Month(myDate), Day(myDate) - (cnt - 1)) If Month(myMon) = Month(myDate) Then Worksheets(Month(myDate) & "月").Select Else Worksheets(Month(myMon) & "月").Select End If End Sub
お礼
なんとか、完成させることができました。 また困ったときがあったらそのときはよろしくお願いします。 どうもありがとうございました。
補足
返事がかなり遅くなってしまってすみません。 気づいていただけると良いのですが・・・ 教えていただいたことから光が見えたものの、 自分の力不足のために思っているように作業が進まず今頃になってしまいました。 教えていただいたことから修正を加えていったところ、全然関係のないところ?でエラーが出てしまいました。 出たエラーは『オブジェクト変数または With ブロック変数が設定されていません。(Error 91)』です。 Dim nth As Integer nth = (Cmb年.Value & Cmb月.Value & Cmb週.Value) Dim mysheet As Worksheet Dim k As Integer Dim i As Integer For i = 1 To 7 k = i + 2 mysheet = Application.WorksheetFunction.VLookup(nth, Range("シート検索"), k, False) データをセットするために見るシート名を検索させるためにvlookupを使うことにしました。 エラーが出るとき、nthは19111(19年11月1週目)を見ています。 kは3(1日目)を見ています。 このことから、「シート検索」をvlookupすると、19年10月29日なので19.10がヒットするはずなのですが、エラーが出るときの結果は「nothing」なのです。 なぜなのかさっぱりわからないのです。。。 よろしくお願いします。