• 締切済み

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

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

みんなの回答

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.5

ありゃごめんなさい,誤記を直し忘れてました。 誤記:  dim x1 as double, x2 as double, yy s double 訂正:  dim x1 as double, x2 as double, yy as double 失礼しました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 Excelの通常の機能の中には、自動でオートシェイプの線を引く事や、自動でオートシェイプの(色や長さ等の)設定を変更する様な事を実現出来る機能は御座いませんので、マクロ等による方法を用いるしか御座いません。  それで、タイトル行が何行目の行なのか何も説明が御座いませんので、取り敢えず仮の話として、タイトル行が2行目の行である場合に対応するVBAのマクロを御伝え致します。  尚、タイトル行が別の行である場合には、下記のVBAの構文の中で、 Const ItemRow = 2 'タイトル行 と記述されている行の中の 2 と記されている箇所を、実際のタイトル行の行番号に合わせて変更して下さい。  そして、下記のマクロの使い方に関してですが、まず、Excelのウィンドウの上の方にある[開発]タブをクリックすると現れる「コード」グループ内の[Visual Basic]ボタンをクリックして下さい。  すると、「Microsoft Visual Basic for Applications」というウィンドウが現れますので、その中の「プロジェクト - VBAProject」という欄内に、 Sheet1(Sheet1) Sheet2(Sheet2) Sheet3(Sheet3)   ・   ・   ・ などという具合に並んでいるシートモジュールの内、御質問の様な処理を行いたいシートのシート名が " ( )内に " 表示されているシートモジュールにカーソルを合わせて、マウスの左ボタンをダブルクリックして下さい。  その上で以下のVBAの構文を「Microsoft Visual Basic for Applications」ウィンドウの右側の欄に入力して下さい。 Private Sub Worksheet_Change(ByVal Target As Range) 'QNo.9113410 日付データで自動でオートシィプの線を引く Const ItemRow = 2 'タイトル行 Const StartDateColumn = "B" '期間の開始日が入力されている列 Const EndDateColumn = "C" '期間の終了日が入力されている列 Const FirstDayColumn = "D" 'タイトル行において最も古い日付の日の値を入力する列 Dim LastRow As Long, FirstDay As Date, LastDay As Date, StartDate As Variant, _ EndDate As Variant, myShape As Shape, temp As Variant, c As Range, i As Long If Intersect(Target, Range(StartDateColumn & ":" & StartDateColumn & "," _ & EndDateColumn & ":" & EndDateColumn), Range(ItemRow + 1 _ & ":" & Cells.SpecialCells(xlCellTypeLastCell).row + 1)) _ Is Nothing Then Exit Sub LastRow = Range(StartDateColumn & Rows.Count).End(xlUp).row temp = Range(EndDateColumn & Rows.Count).End(xlUp).row If LastRow < temp Then LastRow = temp If LastRow <= ItemRow Then Exit Sub FirstDay = DateSerial(9999, 12, 31) LastDay = DateSerial(1904, 1, 1) For i = ItemRow + 1 To LastRow StartDate = Range(StartDateColumn & i).Value If StartDate > DateSerial(1904, 1, 1) And StartDate < FirstDay Then FirstDay = StartDate EndDate = Range(EndDateColumn & i).Value If EndDate > LastDay And EndDate < DateSerial(9999, 12, 31) Then LastDay = EndDate Next i With Application .ScreenUpdating = False .Calculation = xlManual End With With Range(Range(FirstDayColumn & ItemRow), _ Cells(LastRow, Cells(ItemRow, Columns.Count).End(xlToLeft).column + 1)) .Range(Range(FirstDayColumn & ItemRow), Cells(ItemRow, _ Cells(ItemRow, Columns.Count).End(xlToLeft).column + 1)).ClearContents For Each myShape In ActiveSheet.Shapes Set c = Range(myShape.TopLeftCell, myShape.BottomRightCell) If Not (Intersect(c, Range(FirstDayColumn & ItemRow + 1 & ":" _ & Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 1).Address)) Is Nothing) _ Then myShape.Delete Next myShape End With For i = FirstDay To LastDay With Range(FirstDayColumn & ItemRow).Offset(, i - FirstDay) .Value = i .NumberFormatLocal = "d" End With Next i For i = ItemRow + 1 To LastRow StartDate = Range(StartDateColumn & i).Value EndDate = Range(EndDateColumn & i).Value If StartDate > DateSerial(1904, 1, 1) And EndDate < DateSerial(9999, 12, 31) _ And StartDate <= EndDate Then Set c = Range(FirstDayColumn & i). _ Offset(, StartDate - FirstDay).Resize(, EndDate - StartDate + 1) With ActiveSheet.Shapes.AddConnector(msoConnectorStraight, _ c.Left, c.Top + c.Height / 2, c.Left + c.Width, c.Top + c.Height / 2).Line .Visible = msoTrue .ForeColor.RGB = RGB(0, 0, 0) .Transparency = 0 .Style = msoLineSingle .Weight = 2 .EndArrowheadStyle = msoArrowheadTriangle .EndArrowheadLength = msoArrowheadLengthMedium .EndArrowheadWidth = msoArrowheadWidthMedium End With End If Next i With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub  以上で準備は完了で、後はタイトル行よりも下の行のB列のセルに開始日を、C列のセルに終了日をそれぞれ入力するだけで、終了日の右側に並んでいる日付が、全ての開始日と終了日を含む期間に合わせて書き換えられた上で、タイトル行よりも下の行には開始日と終了日に対応した位置にオートシェイプの矢印が表示される様になります。(開始日と終了日のどちらか一方でも手作業で消去された場合には、その行の矢印も自動的に削除されます)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

1行目をタイトル行、2行目からデータとして B列に開始日、C列に終了日として 1行目には「15」「16」のように「日」だけが生数字で記入してあるとして。 手順: ALT+F11を押す 現れた画面で挿入メニューから標準モジュールを挿入する 現れたシートに下記をコピー貼り付ける sub macro1()  dim r as long  dim c1 as long, c2 as long  dim x1 as double, x2 as double, yy s double  for r = 2 to range("A65536").end(xlup).row   if isdate(cells(r, "B")) and isdate(cells(r, "C")) then    c1 = application.match(day(cells(r, "B")), rows(1), 0)    c2 = application.match(day(cells(r, "C")), rows(1), 0)    x1 = cells(r, C1).left    x2 = cells(r, C2).left + cells(r, C2).width    yy = cells(r, C1).top + cells(r, C1).height / 2    on error resume next    activesheet.shapes("arrow_" & r).delete    on error goto 0    with activesheet.shapes.addconnector(msoconnectorstraight, x1, yy, x2, yy)     .shaperange.line.endarrowheadstyle = msoarrowheadopen     .name = "arrow_" & r    end with   end if  next r end sub ファイルメニューから終了してエクセルに戻る ALT+F8を押し、マクロを実行する。

no_42jp
質問者

補足

回答ありがとうございます 実行してみましたが   dim x1 as double, x2 as double, yy s double で構文エラーが出てしまいました

  • msMike
  • ベストアンサー率20% (363/1775)
回答No.2

[No.1]の式は次の方が首尾一貫してますね。済みません。 =AND(DAY($B2)<=D$1,DAY($C2)>=D$1)

  • msMike
  • ベストアンサー率20% (363/1775)
回答No.1

単なる塗りつぶしで御免(*^_^*) 条件付き書式のための数式は次のとおり =AND(DAY($B2)<D$1+1,DAY($C2)>=D$1) 【独白】オートシヱイプ矢印でも可能なのだらうか?いえ、私はさうは思はない!

関連するQ&A

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

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

  • 検索したい日付からデータを抽出したい。

    こんにちわ。 キャンペーンが何日~何日までどういった内容がある、という一覧を作成しています。 Aの列が開始日、Bの列が終了日、Cの列がキャンペーン内容、です。 検索したい日付をD1のセルに入力したら、その日付に該当するキャンペーンすべてを別のシートに抽出できないでしょうか・・・ オートフィルタで抽出は出来るのですが、日付を入力しただけで抽出 させたいのですが、無理でしょうか・・・ よろしくお願いします。

  • Excel 日付から1日の平均を求めたいです

    Excelで頭を抱えています。 どなたかわかる方が居たら教えてください。 Excelには以下のようなDATAが入力されています。  A列  B列 C列 D列 E列・・・・・・     開始日 終了日  加工(h)    4/3 4 5 6 7 8 4/3  4/8    10     ←---------------→               (加工日数をオートシェイプで表示) コレに行を追加し(最終的には非表示) 4/3~4/8の間で加工時間に1日平均何時間かかったかを表示したいのです。 日付のセルには4/1を基準として、+1の式を入力してあります。 説明不足で申し訳ありませんが 何方かわかる方が居たら教えてください。 よろしくお願いします。

  • Excelで出欠簿を作成する際に自動で特定の日付を入れたい

    Excelで出欠簿を作成する際に自動で特定の日付を入れたいと思っています。 参加者はA列のA3~A10にあるとして、A1に2009年とし、B1に月を入力すると、 2行目のB2にその月の月曜日の日付、B2に木曜日の日付、C2に土曜日の日付を自動で入れることが出来ないかと悩んでおります。 検索しましたが、 このような抜き出した形でのやり方が見つけられませんでした。 お手数ですか、 ご経験やお分かりになる方がいらっしゃったらご教授いただけると助かります。 よろしくお願いいたします。

  • エクセルで自動で日付と時間を入れることはできますか?

    こんにちは、今現在  A列に 日付 B列に 日時 C列に管理番号を入力しています。 Ctrl+;とCtrl+:を使って 日付と日時を入力しているのですが C列に管理番号を入力したらA列とB列に自動で入力される マクロもしくはVBAは可能でしょうか? ご存知の方いらっしゃいましたら、ご教示ください。 m__m

  • Exelマクロ日付の自動計算 契約期間と抵触の日

    契約期間の管理をしているエクセルファイルがあります。 A列に契約開始日、B列に契約終了日、C列にその契約期間(月数)があり、終了日が近くなったら同じ月数だけ契約を更新します。 そしてD列に、その契約の最長期限に抵触する日付があります。 契約開始日からC列の月数だけ更新を重ねていった場合に、抵触する日を越えた最初の契約開始日をE列に自動で表示させたいです。 自動計算のマクロをご教授ください。

  • Excel VBAでデータを自動処理したい

    Excelで大量のデータ処理をしなくてはならないのですが、以下の処理をExcel VBAで自動処理できないでしょうか? どなたかお知恵をお貸しください。 (1)A、B、C列からなるリストがあります。A,B列にはそれぞれオートフィルタが設定してあり、C列は空白です。A列、B列にそれぞれ条件を設定し、抽出したデータのC列(空白)に特定のデータを入力します。A列、B列2つの条件の組み合わせが100通りくらいあり、現在手動でオートフィルタを設定し、C列にデータを入力しております。例えばA,B列の条件の組み合わせと、それに対応するC列に入力するデータを表にしたテーブルを別に作り、A,B列の条件を自動に設定して、抽出し、C列にデータを自動に入力することを、テーブルの一番上の行から最後の行まで繰り返す、というようなことをVBAでExcelにしてもらいたいのです。自分でちゃんと勉強し、調べて、それでも分からなかったらお聞きするというのが筋だと思うのですが、今この仕事に追われて、時間がありません。(ほとんど毎日午前様です。)この仕事が片付いたら、じっくりVBAを勉強したいと思っております。どうぞよろしくお願いいたします。

  • エクセル表→セル内データ更新→同じ行の最終更新日欄の日付を自動更新 し

    エクセル表→セル内データ更新→同じ行の最終更新日欄の日付を自動更新 したい。 エクセルで作成した表で、表の中のデータを更新した場合に、その行の最後の列の「最終更新日」の日付を自動的に更新する方法を探しています。 具体的には、エクセルで1行目のA列に「データのキーワード」、B列に「データのハイパーリンク」、C列に「データ記入者」、D列に「最終更新日」の項目を作成し、2行目以降に作成した各データをA~Cの項目に従って記入してデータ一覧表を作成しています。 その際に、A,C列の項目を更新した時と、B列項目のリンクを開いた時に、同じ行D列の最終更新日の日付を自動で入力及び更新する方法はないでしょうか? 恐らくマクロを組む必要があると思うのですが、全くの素人ですので是非教えて頂けないでしょうか? すみませんが、宜しくお願い致します。

  • 日付に自動で色を付けたいのですが?

    A列に日付 B列に曜日を入れています。 B列の曜日は条件付き書式を使って土曜日は青・日曜日は赤で自動的に色が付くようにしています。 B列に自動的に色が付いた所にあるA列の日付も自動的に色が付く方法はないでしょうか? よろしくお願いします。

  • 日付を抜き出したい

    画像のようにA2~A3に文字列で日付が入力されています。 B2:C3に日付形式でA2に入力されている日付を”ー"で分けて西暦をつけて表示したいと考えています。 D2には開始日の日付の前日の日付を表示したいと考えています 年が変わった場合には翌年の日付を表示するにはどのような式を入力すればいいでしょうか。

専門家に質問してみよう