- 締切済み
エクセルVBAでのスケジュール作成
いつも大変お世話になっております。 本日も質問させてください。 会社指定の異なる2つのブックのエクセル表に自分の部署の社員全員のスケジュールを入れなければいけません。 (1つは月間、もう1つは週間で、それぞれ各月、各週毎にシートがあります。) VBAのフォームを作成し、週間スケジュールは自動でセットできるようになりました。 ですが、月間のスケジュールがうまくいかなくて困っています。 (入力フォームは共通のものを使用します。) スケジュールの表はシートが月別になっていてA列に社員名、1行目に日付、2行目に曜日、3行目に祝日が表示されるようになっています。 4行目からが各社員のスケジュールですが、1人の1日分のスケジュール入力のセルは2列×3行=6セルです。 (わかりにくいので図で表現したかったのですが、ずれて表示されてしまって余計にわかりにくいのでやめてみました。ちなみに、1人目の1日目のスケジュールのセル範囲はB4:C6となります。) そして、各セルには入力する項目が決まっています。 (この項目についてはフォームで作成済みです。) セルが多いため、Rangeを使おうと思っても指定するのが困難です。 個人的にはRangeのセルの値を別シートに作成した表からindexで検索できたらなぁ。と思っています。 できるかどうかすらわかっていませんが。(汗) もちろん、もっと効率的な方法があればそちらを教えていただきたいです。 週間スケジュールのセルから入力値をもってくる事も考えたのですが、月間は1日から必ず始まっていますが、週間は月曜日からのため、月や週によって日付が異なることなどから、やはり私には難しいのです。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- n-jun
- ベストアンサー率33% (959/2873)
Index関数とMatch関数をうまく使ってみては? 例) A B C D E 1 りんご 100 すいか 250 2 みかん 150 3 バナナ 200 4 すいか 250 5 柿 180 6 もも 160 Sub test() Dim r As Range, rr As Range Dim v Set r = Range("A1:B6") With WorksheetFunction v = .Index(r, .Match(Range("D1").Value, r.EntireColumn(1), 0), 2) Range("E1").Value = v Set rr = Range("A" & .Match(Range("D1").Value, r.EntireColumn(1), 0)) End With MsgBox rr.Address End Sub Match関数で見つかった番号をA列の行番号として与えている。 項目行がある場合には適宜修正の事。 ご参考になれば。
- n-jun
- ベストアンサー率33% (959/2873)
>セルが多いため、Rangeを使おうと思っても指定するのが困難です。 >個人的にはRangeのセルの値を別シートに作成した表からindexで検索できたらなぁ。と思っています。 この部分を具体的にされては? セルが多い=指定が困難? Indexで何を検索するのか? 例) フォームに入力した日付を基に、シートとセル番地を検索して その位置にスケジュールを書き込みたい。 とか? >(わかりにくいので図で表現したかったのですが、ずれて表示されてしまって >余計にわかりにくいのでやめてみました。 試しに提示してみたらよかったのでは? そこで、不明な点を質疑応答をしていけば良かったと思いますけど。
補足
不明確な質問ですみません。 まず、入力フォームは 社員番号を入力する。(氏名が自動で表示される。) 年・月・週を指定する。(月~日の日付が自動表示される。) 各日の予定(休暇、訪問先名、業務内容)を入力する。 入力データを表にセットする。 と言うようになっています。 週間スケジュールは年・月・週からシートを指定し、7日分しかないため、すべての項目をRangeでセルの指定をしてあります。 (「○○さんの月曜日の予定が有休ならこのセルにデータをセットさせる。」と言った感じで指定しています。) 月間スケジュールも週間と同様に年・月からシートを指定できます。 ただし、1シートに最小でも28日、最大31日分もセルがあるため、週間同様にRangeでセルの指定をするとデータが重すぎて動かなくなってしまうと思うのです。 そこで、アドバイスを頂いたとおり、社員番号と日付からセルを検索してその位置にデータをセットしたいのです。 このことより、私が考えてみたのは・・・ 例えば月曜日の1項目目を「mon1」とします。 (「セル領域」は私が作成したセル検索の表名、「Lbl入力日1」は月曜日の日付、その後ろの「1」は1項目目を意味します。) dim mon1 as string mon1 = Application.WorksheetFunction.Index(Range("セル領域"), Lbl入力日1.Caption, 1) です。 ここからRangeにつなげられないかと思ったのですが、わたしにはできませんでした。 これで少しは現状と要望が明確になればいいのですがいかがでしょうか? よろしくお願いします。