カレンダーに日付を配置する方法の疑問

このQ&Aのポイント
  • 予定日と実行日のセルに入力された日付をカレンダーに配置する方法について教えてください。
  • 検索してみたものの、複数のカレンダー書式があったりして参考にならず困っています。
  • プログラミング経験はあるが、他のコードを理解するのが難しいため、具体的な方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

入力された日付に対応する位置に矢印を配置したい

画像のようなカレンダーを使用しています。 1月1日~12月31日まで横に続いています。 予定日の開始と終了のセルに入力された日付をカレンダー部分の対応する日付にオートシェイプの矢印をセル上部に配置 同じように実行日の開始と終了のセルに入力された日付を対応する日付にオートシェイプの矢印をセル下部に配置する処理がしたいです 画像は参考程度に手動で配置した状態です。 ガントチャートで検索すると様々なやり方が公開されていますが、どれもカレンダーの書式が違ったりと参考にするには難しかったです 多少プログラミングの経験はあるのですが、公開されているコードを見てもいまいちわかりませんでした。 どなたかご教示願います

  • mrll
  • お礼率16% (1/6)

質問者が選んだベストアンサー

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.5

>予定日にしか日付が入力されていない場合は赤の矢印だけ配置することは可能でしょうか...? 配置しないという制御の場合、 後からその箇所に配置することになった場合の制御が面倒なので、 開始、終了の日付の一方でも埋まっていない場合は 矢印の変更を行わないようにしました。 (矢印が見えないままなので、見掛け上配置しない場合と同等です) 加えて、 ・既に削除されているなど、削除できない場合にはスルーするように。 ・実線/破線の指定を加え ・太さの指定を加え ・参考にしたurlを貼っておきました。 Sub sample1() '図形を初期配置  Dim RowCnt As Long  Dim tgSh As Worksheet  Set tgSh = ThisWorkbook.Sheets(1)  RowCnt = 4  Do   If tgSh.Cells(RowCnt, 1).Value = "" Then Exit Do   MakeArrow tgSh, RowCnt, 8, 1   MakeArrow tgSh, RowCnt, 8, 2   RowCnt = RowCnt + 1  Loop End Sub Sub sample2() '図形を全数削除  Dim RowCnt As Long  Dim tgSh As Worksheet  Set tgSh = ThisWorkbook.Sheets(1)  RowCnt = 4  Do   If tgSh.Cells(RowCnt, 1).Value = "" Then Exit Do   DelArrow tgSh, RowCnt, 1   DelArrow tgSh, RowCnt, 2   RowCnt = RowCnt + 1  Loop End Sub Sub sample3() '図形の表示開始位置、表示最終位置を変更  Dim RowCnt As Long  Dim tgSh As Worksheet  Dim SCol1 As Long  Dim ECol1 As Long  Dim SCol2 As Long  Dim ECol2 As Long    Set tgSh = ThisWorkbook.Sheets(1)  RowCnt = 4    Do   If tgSh.Cells(RowCnt, 1).Value = "" Then Exit Do   With tgSh    If IsDate(.Cells(RowCnt, 1).Value) And _      IsDate(.Cells(RowCnt, 2).Value) Then     SCol1 = tgSh.Cells(RowCnt, 1).Value - DateSerial(2019, 12, 31) + 8     ECol1 = tgSh.Cells(RowCnt, 2).Value - DateSerial(2019, 12, 31) + 9     EditArrow tgSh, RowCnt, SCol1, ECol1, 1    End If    If IsDate(.Cells(RowCnt, 6).Value) And _      IsDate(.Cells(RowCnt, 7).Value) Then     SCol2 = tgSh.Cells(RowCnt, 6).Value - DateSerial(2019, 12, 31) + 8     ECol2 = tgSh.Cells(RowCnt, 7).Value - DateSerial(2019, 12, 31) + 9     EditArrow tgSh, RowCnt, SCol2, ECol2, 2    End If    RowCnt = RowCnt + 1   End With  Loop   End Sub '//================================初期表示 '// プロパティ一覧 http://officetanaka.net/excel/vba/tips/tips177.htm Sub MakeArrow(Sh As Worksheet, SRow As Long, Scol As Long, MyPosCode As Long)  'MyPosCode 表示位置(上下)1:上から1/3 2:上から2/3  Dim MyPos As Double  Dim ArrowName As String  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  If MyPosCode = 1 Then   MyPos = Sh.Cells(SRow, Scol).Height / 3  Else   MyPos = Sh.Cells(SRow, Scol).Height / 3 * 2  End If  With Sh.Shapes.AddConnector( _   Type:=msoConnectorStraight, _   BeginX:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left, _   Beginy:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Top + MyPos, _   EndX:=Range(Sh.Cells(SRow, Scol + 1), Sh.Cells(SRow, Scol + 1)).Left, _   EndY:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Top + MyPos)   .Line.EndArrowheadStyle = msoArrowheadStealth   .Name = ArrowName   .Line.Weight = 2  '太さ   '.Line.DashStyle = msoLineSysDot  '破線   .Line.DashStyle = msoLineSolid  '実線   If MyPosCode = 1 Then    .Line.ForeColor.RGB = RGB(255, 0, 0) '赤   Else    .Line.ForeColor.RGB = RGB(0, 0, 255) '青   End If    End With  'Sh.Shapes.Range(Array(ArrowName)).Visible = False  '※本番用  Sh.Shapes.Range(Array(ArrowName)).Visible = True  '※デバック用 End Sub '//================================削除 Sub DelArrow(Sh As Worksheet, SRow As Long, MyPosCode As Long)  Dim ArrowName As String  On Error Resume Next  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  Sh.Shapes.Range(Array(ArrowName)).Delete End Sub '//================================開始位置、終了位置を変更して表示する Sub EditArrow(Sh As Worksheet, SRow As Long, Scol As Long, ECol As Long, MyPosCode As Long)  Dim MyPos As Double  Dim ArrowName As String  On Error Resume Next  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  Sh.Shapes(ArrowName).Left = _   Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left  Sh.Shapes(ArrowName).Width = _   Range(Sh.Cells(SRow, ECol), Sh.Cells(SRow, ECol)).Left - _   Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left  Sh.Shapes.Range(Array(ArrowName)).Visible = True End Sub

その他の回答 (4)

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.4

更にごめんなさい。 上側と下側の矢印の色を変えるんですね。 Sub MakeArrow(.... を 以下に差し替えてください。 '//================================初期表示 Sub MakeArrow(Sh As Worksheet, SRow As Long, Scol As Long, MyPosCode As Long)  'MyPosCode 表示位置(上下)1:上から1/3 2:上から2/3  Dim MyPos As Double  Dim ArrowName As String  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  If MyPosCode = 1 Then   MyPos = Sh.Cells(SRow, Scol).Height / 3  Else   MyPos = Sh.Cells(SRow, Scol).Height / 3 * 2  End If  With Sh.Shapes.AddConnector( _   Type:=msoConnectorStraight, _   BeginX:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left, _   Beginy:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Top + MyPos, _   EndX:=Range(Sh.Cells(SRow, Scol + 1), Sh.Cells(SRow, Scol + 1)).Left, _   EndY:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Top + MyPos)   .Line.EndArrowheadStyle = msoArrowheadStealth   .Name = ArrowName     If MyPosCode = 1 Then    .Line.ForeColor.RGB = RGB(255, 0, 0) '赤   Else    .Line.ForeColor.RGB = RGB(0, 0, 255) '青   End If    End With  'Sh.Shapes.Range(Array(ArrowName)).Visible = False  '※本番用  Sh.Shapes.Range(Array(ArrowName)).Visible = True  '※デバック用 End Sub

mrll
質問者

補足

>HohoPapaさん とても丁寧にありがとうございます...! こちらの環境でもプログラムを実行することができました。 ただ、予定日には日付が入力されていて実行日に日付が入力されていないセルがある場合、プログラムの実行が停止してしまいます。 予定日にしか日付が入力されていない場合は赤の矢印だけ配置することは可能でしょうか...? はじめにこのような場合もあることを記載しておくべきでした、申し訳有りません。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.3

#2です。 >1月1日~12月31日まで横に続いています。 これを見落としていましたので差し替えます。 Sub sample1() '図形を初期配置  Dim RowCnt As Long  Dim tgSh As Worksheet  Set tgSh = ThisWorkbook.Sheets(1)  RowCnt = 4  Do   If tgSh.Cells(RowCnt, 1).Value = "" Then Exit Do   MakeArrow tgSh, RowCnt, 8, 1   MakeArrow tgSh, RowCnt, 8, 2   RowCnt = RowCnt + 1  Loop End Sub Sub sample2() '図形を全数削除  Dim RowCnt As Long  Dim tgSh As Worksheet  Set tgSh = ThisWorkbook.Sheets(1)  RowCnt = 4  Do   If tgSh.Cells(RowCnt, 1).Value = "" Then Exit Do   DelArrow tgSh, RowCnt, 1   DelArrow tgSh, RowCnt, 2   RowCnt = RowCnt + 1  Loop End Sub Sub sample3() '図形の表示開始位置、表示最終位置を変更  Dim RowCnt As Long  Dim tgSh As Worksheet  Dim SCol1 As Long  Dim ECol1 As Long  Dim SCol2 As Long  Dim ECol2 As Long    Set tgSh = ThisWorkbook.Sheets(1)  RowCnt = 4    Do   If tgSh.Cells(RowCnt, 1).Value = "" Then Exit Do   SCol1 = tgSh.Cells(RowCnt, 1).Value - DateSerial(2019, 12, 31) + 8   ECol1 = tgSh.Cells(RowCnt, 2).Value - DateSerial(2019, 12, 31) + 9   SCol2 = tgSh.Cells(RowCnt, 6).Value - DateSerial(2019, 12, 31) + 8   ECol2 = tgSh.Cells(RowCnt, 7).Value - DateSerial(2019, 12, 31) + 9   EditArrow tgSh, RowCnt, SCol1, ECol1, 1   EditArrow tgSh, RowCnt, SCol2, ECol2, 2   RowCnt = RowCnt + 1  Loop End Sub '//================================初期表示 Sub MakeArrow(Sh As Worksheet, SRow As Long, Scol As Long, MyPosCode As Long)  'MyPosCode 表示位置(上下)1:上から1/3 2:上から2/3  Dim MyPos As Double  Dim ArrowName As String  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  If MyPosCode = 1 Then   MyPos = Sh.Cells(SRow, Scol).Height / 3  Else   MyPos = Sh.Cells(SRow, Scol).Height / 3 * 2  End If  With Sh.Shapes.AddConnector( _   Type:=msoConnectorStraight, _   BeginX:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left, _   Beginy:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Top + MyPos, _   EndX:=Range(Sh.Cells(SRow, Scol + 1), Sh.Cells(SRow, Scol + 1)).Left, _   EndY:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Top + MyPos)   .Line.EndArrowheadStyle = msoArrowheadStealth   .Name = ArrowName  End With  'Sh.Shapes.Range(Array(ArrowName)).Visible = False  '※本番用  Sh.Shapes.Range(Array(ArrowName)).Visible = True  '※デバック用 End Sub '//================================削除 Sub DelArrow(Sh As Worksheet, SRow As Long, MyPosCode As Long)  Dim ArrowName As String  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  Sh.Shapes.Range(Array(ArrowName)).Delete End Sub '//================================開始位置、終了位置を変更して表示する Sub EditArrow(Sh As Worksheet, SRow As Long, Scol As Long, ECol As Long, MyPosCode As Long)  Dim MyPos As Double  Dim ArrowName As String  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  Sh.Shapes(ArrowName).Left = _   Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left  Sh.Shapes(ArrowName).Width = _   Range(Sh.Cells(SRow, ECol), Sh.Cells(SRow, ECol)).Left - _   Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left  Sh.Shapes.Range(Array(ArrowName)).Visible = True End Sub

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.2

面白そうで、私も今後使うかもしれないので書いてみました。 I列が必ず1日である。という条件でよければ 以下のコードはいかがでしょうか? sample1は、予め矢印を配置するコードです。 最終的に使うときは、  'Sh.Shapes.Range(Array(ArrowName)).Visible = False  '※本番用  Sh.Shapes.Range(Array(ArrowName)).Visible = True  '※デバック用 後者をコメントアウトし、前者を生かしてください。 sample2は、配した図を全数削除するコードです。 sample3が、配した図を求めに応じて、開始位置終了位置を変更するコードです。 Sub sample1() '図形を初期配置  Dim RowCnt As Long  Dim tgSh As Worksheet  Set tgSh = ThisWorkbook.Sheets(1)  RowCnt = 4  Do   If tgSh.Cells(RowCnt, 1).Value = "" Then Exit Do   MakeArrow tgSh, RowCnt, 8, 1   MakeArrow tgSh, RowCnt, 8, 2   RowCnt = RowCnt + 1  Loop End Sub Sub sample2() '図形を全数削除  Dim RowCnt As Long  Dim tgSh As Worksheet  Set tgSh = ThisWorkbook.Sheets(1)  RowCnt = 4  Do   If tgSh.Cells(RowCnt, 1).Value = "" Then Exit Do   DelArrow tgSh, RowCnt, 1   DelArrow tgSh, RowCnt, 2   RowCnt = RowCnt + 1  Loop End Sub Sub sample3() '図形の表示開始位置、表示最終位置を変更  Dim RowCnt As Long  Dim tgSh As Worksheet  Set tgSh = ThisWorkbook.Sheets(1)  RowCnt = 4  Do   If tgSh.Cells(RowCnt, 1).Value = "" Then Exit Do   EditArrow tgSh, RowCnt, Day(tgSh.Cells(RowCnt, 1).Value) + 8, _    Day(tgSh.Cells(RowCnt, 2).Value) + 9, 1   EditArrow tgSh, RowCnt, Day(tgSh.Cells(RowCnt, 6).Value) + 8, _    Day(tgSh.Cells(RowCnt, 7).Value) + 9, 2   RowCnt = RowCnt + 1  Loop End Sub '//================================初期表示 Sub MakeArrow(Sh As Worksheet, SRow As Long, Scol As Long, MyPosCode As Long)  'MyPosCode 表示位置(上下)1:上から1/3 2:上から2/3  Dim MyPos As Double  Dim ArrowName As String  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  If MyPosCode = 1 Then   MyPos = Sh.Cells(SRow, Scol).Height / 3  Else   MyPos = Sh.Cells(SRow, Scol).Height / 3 * 2  End If  With Sh.Shapes.AddConnector( _   Type:=msoConnectorStraight, _   BeginX:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left, _   Beginy:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Top + MyPos, _   EndX:=Range(Sh.Cells(SRow, Scol + 1), Sh.Cells(SRow, Scol + 1)).Left, _   EndY:=Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Top + MyPos)   .Line.EndArrowheadStyle = msoArrowheadStealth   .Name = ArrowName  End With  'Sh.Shapes.Range(Array(ArrowName)).Visible = False  '※本番用  Sh.Shapes.Range(Array(ArrowName)).Visible = True  '※デバック用 End Sub '//================================削除 Sub DelArrow(Sh As Worksheet, SRow As Long, MyPosCode As Long)  Dim ArrowName As String  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  Sh.Shapes.Range(Array(ArrowName)).Delete End Sub '//================================開始位置、終了位置を変更して表示する Sub EditArrow(Sh As Worksheet, SRow As Long, Scol As Long, ECol As Long, MyPosCode As Long)  Dim MyPos As Double  Dim ArrowName As String  ArrowName = "Zu" & Format(SRow, "0000") & Format(MyPosCode, "0")  Sh.Shapes(ArrowName).Left = _   Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left  Sh.Shapes(ArrowName).Width = _   Range(Sh.Cells(SRow, ECol), Sh.Cells(SRow, ECol)).Left - _   Range(Sh.Cells(SRow, Scol), Sh.Cells(SRow, Scol)).Left  Sh.Shapes.Range(Array(ArrowName)).Visible = True End Sub

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.1

たとえば既に存在する矢印(名前が直線矢印コネクタ 1として)をオレンジ色の所に配置でしたら ActiveSheet.Shapes.Range(Array("直線矢印コネクタ 1")).Left = Range("I4").Left ActiveSheet.Shapes.Range(Array("直線矢印コネクタ 1")).Width = Range("M4").Left - Range("I4").Left ActiveSheet.Shapes.Range(Array("直線矢印コネクタ 1")).Top = Range("I4").Top + Range("I4").RowHeight / 2 新しく矢印を引く場合は以下のサイトを参考に https://xtech.nikkei.com/it/atcl/column/15/090100207/090100086/

関連するQ&A

  • EXCEL 工程表の作成にて日付を入力されたの下のセルに線を引くマクロの作り方

    いつもこのサイトを参考にさせていただいております。 QNo.1538992を参考に自分でも工程表を作成していましたが、 日付の開始日と終了日を判定して線を自動的に引くマクロの作成方法を教えて頂けませんでしょうか。 実際にはセルC4に日付を入力しD4は=C4+1,E4は=D4+1といったような感じで 3ヶ月の表を作成します。 縦軸のセルA欄には作業の開始日を、セルB欄には作業の終了日を入力します。 セルの横軸の日付を参照して△ーーーーーー○をオートシェイプで自動的に書きたいのです。 三角は開始、○は終了で、その間をオートシェイプの線で書きます。 できれば、作業の終了日を入力した段階で自動的に線を引ければありがたいのですが…。 以上、よろしくお願いいたします。

  • Excelで矢印。

    セルA2からセルA1に移動したということを矢印を使って入力したいのですが、湾曲した矢印はオートシェイプの曲線や矢印オートシェイプの線を細くしたりして使うしかないでしょうか? セルB2からセルA2の中に上向きの湾曲矢印を書きたいのですが、ほかに方法はありますか?

  • 日付を入力しカレンダーの該当する日を塗りつぶしたい

    添付の画像のように (1)「開始日」と「終了日」に日付を入れる (2)すぐ下にあるカレンダーの「該当の日付のセルが塗りつぶされる」 ということをやりたいと思っています。 条件付書式?や関数で対応できるものでしょうか。

  • エクセルで日にちを入力すると矢印が自動的に引かれるとか。

    こんにちは。 エクセルで作業の進捗表を作成しています。 作業開始日と終了日を入力すると、 開始日~終了日が自動的に矢印として カレンダーに引かれる関数のような ものはありますか? ご存知の方、よろしくお願いします!

  • 日付データで自動でオートシィプの線を引く

    A列に内容 B列に開始日 C列に終了日を日付で入力し タイトル行に1日おきの日付を入力しサンプルのように 開始日から終了日までオートシェイプで線を自動で引くには どうしたら良いでしょうか

  • Excel2003(カレンダー)を使っての日付入力

    Excel2003を使って、(既に用意されている)カレンダーから該当日を選択し、 対象のセルにその日付を反映(代入)させる方法について教えてください。 例えば、A1セルに「終了予定日」とあり、隣りのB1セルに日付を入力する際には、 まず(用意されている)カレンダーを表示させ、そこから該当日(2014.3.31)を選択後、 そのままその日付をB1セルに反映(代入)できるようにしたいのですが、 何かいい方法はありませんでしょうか? 他の質問箱も見て、挿入→オブジェクト→カレンダーコントロール11.0など、 色々試してみたのですが、うまくいきませんでした。 お分かりになる方がおられましたら、分かりやすいご説明よろしくお願いします。

  • オートシェイプの矢印の横に文字を入力する方法

    ワードのオートシェイプ機能などで、矢印の横に少々文字を自動で入力できるようにする機能ってありますか?「そして」、とか、「したがって」、とかを入力できれば助かります。文字入力を織り込んだオートシェイプの矢印とかないでしょうか? 現状は、矢印を書いてさらにその矢印のわきにテキストボックスでそういうことをしているので時間がかかって大変なんです。

  • アクセスでの日付入力

    ACCESSで手間のかかる日付入力を出来るだけ簡単に入力できたらと考えています。 カレンダーコントロールを使用すると、日付入力のテキストボックスの数分カレンダーコントロールが必要になってしまうので、出来れば今日の日付を常に表示してボタンを使って前後の日付に変更出来るようにしたいと思っているのですが。 もしくは、コンボボックスのように矢印をクリックすると、カレンダーが出てくるのでも良いのですが。 何か良い方法があれば教えて下さい。

  • アクセスの日付入力について。

    アクセスのフォームで日付入力をカレンダーコントロールから入力しようと考えていますが、日付入力フィールドが8種類あります。例えば、A購入日、B修理日、C修理完了日、D保守開始日、E保守終日、、、 などです。これらに1つずつカレンダーコントロールを設けることしか考えがないのですが、他によい方法があると思いますが、教えてください。現在DとEはDateAddで算出し、1つのカレンダーでまかなっています。 例えば、1つのカレンダーを固定して、新規画面を開いたときはその日の日付が表示され、それから加減して入力することは可能でしょうか?よろしくお願いいたします。

  • excelの日付を簡単に入力したいのですが・・・

    質問させていただきます。 excelで日付を「月/日(曜日)→○○/○○(○)」、 本日でしたら「11/11(火)」というかたちに入力し、 セルを横にコピーすると日付の箇所だけ数字が 増えていき、曜日はそのままずっと火曜日で コピーされてしまいます。 これをカレンダーどおりに日付と曜日が合致する ようにしたいのですが、どなたかご教授して いただけないでしょうか?

専門家に質問してみよう