ExcelVBAのオートシェイプ幅設定について

このQ&Aのポイント
  • ExcelVBAのオートシェイプの幅を時間と結びつける方法について分かりません。
  • 現在、A2からA3のオートシェイプを時間の列と対応させようとしていますが、幅が長くなりすぎてしまいます。
  • 質問の式内の★部分が理解できず、変数の値や計算方法についても分かりません。
回答を見る
  • ベストアンサー

excelVBAのオートシェイプ幅設定について

いつもお世話になっております。 以前こちらでお教えしてもったVBAを試してみたのですが、うまくいきません。 自分なりに調べてきたつもりですが、オートシェイプの幅を時間と結びつけるやり方がよくわかりません。 A2=14:30 A3=15:15 A4=45      B  C  D … 3行目 0   1  2  … で、4行目に、A2~A3のオートシェイプを時間の列と対応するよう作成したいのですが、幅が長くなりすぎてしまいます。 Columns("A:Z").ColumnWidth = 9 変数S = Cells(4, 2) 変数E = Cells(4, 25) ★変数Width = 変数E.Left + 変数E.Width - 変数S.Left 変数Height = 変数E.Height 変数Top = 変数S.Top ★変数Min = 変数Width / 1440 ★変数Start = Cells(1, 2).Value * 1440 * 変数Min + 変数S.Left 変数End = Cells(1, 3).Value * 24 ★変数2Width = Cells(1, 4).Value * 変数Width ActiveSheet.Shapes.AddShape(msoShapeRectangle, 変数Start, 変数Top, 変数2Width, 変数Height).Select となっていますが、 ★部分がよくわかりません。 変数Width = 変数E.Left + 変数E.Width - 変数S.Left を求めて、なぜ、A4に*ことになるのか。 1440はどこからきた数字なのか。 そもそもこの式自体が間違っているのでしょうか。 トンチンカンな質問になっていたら申し訳ございません。 よろしくお願いします。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.3

なるほど(笑)。 見たことがある案件だなぁとは思ったのですが(笑)。 掻い摘んで要件を。 ★1について ここは、四角を置く行を指定しています。 「下側から該当日付を探し、上側E列のスケジュール番号から1引いた分だけ下の行」 を指定するための式を想定しています。(ちょっとわかりづらいですね。) つまり、図だと12/1の1番の予定だと、 ・下から12/1を探す→11行目が返る ・スケジュールが1番なので、1-1=0行下を見る→11行目 あるいは図の4行目だと ・12/1を探す→11行目が返る ・スケジュールが2番なので、2-1=1行下を見る→12行目に四角を置く としたいので、オフセットを使って書いています。 ★2について Format関数は、数値を指定の文字列に変換する関数です。 関数についての詳細は別途お調べくださいませ。 書式を「hhnn」とすることで「12時15分→1215」で返してきます。 もちろん分(Minute)として「hhmm」でもちゃんと判断してくれますが、 月(Month)を表す「m」と区別したいための・・ いわゆる古い世代の人間の癖と思っていただければ目安になるかと(笑)。 ちなみにここは、四角形に「名前」を付けるための処理ですね。 ★3について ここは全体(1日分)の列幅の合計をカウントしています。 SHEndに代入されたセルの左端の座標に同セルの幅を足して、1日分の終端を、 SHStartに代入されたセルの左端の座標を1日の始端をそれぞれ計算し、 終端-始端 で1日の幅を決めています。 コードの冒頭でセルの幅を可変にするように指定していますから、   Columns("A:Z").ColumnWidth = 9 '列幅です。適宜。 この処理が必要、という事です。 (列幅が常に変わらないのであれば、固定値でもOKではあります。) コレを1440(60分×24時間)で除することで、 1分の幅(SHMin)が決まる、と言う流れです。 行高に関しても同様と思ってください。 ★4について ここは時間を表す数値に関する話ですね。 エクセル(に限った話ではないですが)、 「0時=0」「24時=1→日に繰り上がり」として計算します。 これより「24時間=1」「12時間=0.5」と計算できます。 つまり、24時間分の四角の幅に「予定時間」を乗することで、 この予定を示す四角の幅を求めるわけです。 全体(1日)の幅が100とし、予定が6時間(=6÷24=0.25日)であれば、 100×0.25=25 が予定の幅、と計算できるわけです。 以上、駆け足で申し訳ありませんが、解説でした。

noritama12
質問者

お礼

いつもありがとうございます! 私はまだまだ勉強不足のようです。 ★1については、つまり今回の件は、offsetの方が感覚的にわかりやすいので使っているということですね。cells(TagNo,1)でも問題はないと思って良いですか? ★2については、hhnnはhhmmでも可能なのですね。hhnnについて少し調べました。こちらが一般的のようですね。 ★3について、こちらようやく理解できました。セルの右端を表すコードがないためこういった計算を採らないといけないようですね。1分の幅についての解説もわかりやすいです。 ★4について、>>「0時=0」「24時=1→日に繰り上がり」として計算します。 これより「24時間=1」「12時間=0.5」と計算できます。 の解説を読んで理解できました。これならどんな幅にしても対応できますね。 すべてに解説をいただき本当にありがとうございます。助かりました。 これでご教授してもらったコードについては一通り理解できましたので、これから応用を利かせていきます。 また不明点等ありましたらこちらのカテゴリに質問させていただくと思います。 見かけたらどうぞよろしくお願いします! 回答ありがとうございました!

その他の回答 (3)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.4

> ★1については、つまり今回の件は、offsetの方が感覚的にわかりやすいので使っているということですね。cells(TagNo,1)でも問題はないと思って良いですか? 言ってしまえば、Offset以外に思いつかなかっただけです(笑)。 何と言いましょうか・・逃げ口上の一つですが、 「正しい書き方」と言うものは存在しないと思っています。 (正規表現と言うものはありますが。) どんな書き方でも、正しい(望む)結果が得られて、実用に耐えるモノであれば、 それが自分(業務)にとっては「正しい書き方」なのだと思っています。 今回、私は試していませんが、cells(TagNo,1)でお望みの結果が得られれば、 それで全く問題は無いと言えます。 真似をして書いていくうちに段々と自分が書きやすい書き方が見えてきますよ^^

noritama12
質問者

お礼

なるほどです笑。 >>どんな書き方でも、正しい(望む)結果が得られて、実用に耐えるモノであれば、 それが自分(業務)にとっては「正しい書き方」なのだと思っています。 私も同様に考えております。力技は好きです。 今回のコードではcells(TagNo,1)でも問題なく動作しましたので、問題無さそうです。 まずは、真似からですね。少しずつアレンジを加えたりしてレベルアップしていきたいです。 何度もありがとうございました!^^

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

お気づきの通り、 > トンチンカンな質問 と言わざるを得ません。 マクロの一部だけを見せられても、 式が間違えているかどうかの判断はつきません。 その一部分だけを見て思った事ですが・・ 変数S・変数Eは何型で宣言しているのでしょうか? 例えばRangeで宣言していて、このセル番地(B4)を格納したいのであれば、   Set 変数S = Cells(4, 2) としてやる必要があります。 それ以外の例えば整数型などで宣言していると   変数S = Cells(4, 2) では、B4セルの「中身」を格納します。 セルの幅によって四角形の(1分当たりの)幅も変わってしまいますから、 ここで計算が狂っている可能性は大いにあります。 1440の意味は、 「1列を1時間と見立て、24時間分(24列)用意した列幅の合計」(変数Width)から 「1分の場合の直線の幅」(変数min)を計算するために 「24時間×60分=1440分」で除している(割り算している)、 と推測できます。 コレに実際の時間(分間)を掛けることによって、 四角形の幅(変数2Width)を決めているのでしょう。 質問が曖昧なため、この回答で的を射ている自信は皆無です。 とりあえず、参考までに。

noritama12
質問者

お礼

回答ありがとうございます。 意味不明な質問になってしまい、申し訳ございません。 変数S・変数EはRangeで宣言していますので、オブジェクト変数?です。 オートシェイプはちゃんと作成されるようになりました。私のミスでおかしくなっておりました。申し訳ございません。 1440の意味、よくわかりました。 ちなみに以前の質問はこちらです。↓ http://oshiete.goo.ne.jp/qa/7849456.html コードはこちらです。 Sub test1() Dim SHStart As Range, SHEnd As Range Dim SHWidth As Single, SHHeight As Single, SHTop As Single Dim SCStart As Single, SCEnd As Single, SCWidth As Single Dim SCName As String Dim TagRow As Long, TagDay As Date, TagNo As Long Columns("A:Z").ColumnWidth = 9 TagDay = Cells(Selection.Row, 1).Value TagNo = Cells(Selection.Row, 5).Value ★1TagRow = Range("A11:A15").Find(What:=TagDay, LookAt:=xlPart).Offset(TagNo - 1, 0).Row ★2SCName = Format(TagDay, "yymmdd") & "_" & TagNo & "_" & Format(Cells(Selection.Row, 3), "hhnn") Set SHStart = Cells(TagRow, 3): Set SHEnd = Cells(TagRow, 26) ★3SHWidth = SHEnd.Left + SHEnd.Width - SHStart.Left SHHeight = SHEnd.Height: SHTop = SHStart.Top SHMin = SHWidth / 1440 SCStart = Cells(Selection.Row, 2).Value * 1440 * SHMin + SHStart.Left SCEnd = Cells(Selection.Row, 3).Value * 24 ★4SCWidth = Cells(Selection.Row, 4).Value * SHWidth ActiveSheet.Shapes.AddShape(msoShapeRectangle, SCStart, SHTop, SCWidth, SHHeight).Select With Selection.ShapeRange With .Fill .ForeColor.RGB = RGB(255, 255, 255)   End With With .Line .ForeColor.RGB = RGB(0, 0, 0)   .Weight = 0.5 End With .Name = SCName End With End Sub ★部分以外は大体理解できたのですが、 ★1のOffset(TagNo - 1, 0)は、Cells(TagNo,1)ではだめですか?あとで編集をしやすくするための措置でしょうか? ★2のhhnnは時刻の表示形式ですか? ★3のコードがよくわかりません。後ろで/1440としているので、時間のシリアル値が算出されるのでしょうか? ★4は、SHWidthが分のシリアル値になるはずだと思うのですが、Cells(Selection.Row, 4).Valueも分のことであり、分*分…?となるのですが…。よくわかりません。 長くなり申し訳ございません。 1つだけでもお教えいただければ幸いです。

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

1440は時間のシリアル値を分表示に変更するための係数 以前の問い合わせということですが、ご自身の質問履歴非公開のためどんな内容の回答から作成されたマクロなのか全く見えてこない 再質問するのであれば前回の質問/回答のリンクを張るか、質問履歴を公開設定されたほうが良いかと思われます

noritama12
質問者

お礼

回答ありがとうございます。 時間のシリアル値を分表示にするための係数だったのですね! 幅の件は、色々触っていると不具合は解消できました。私の単純ミスでした。 しかし、まだコードの理解自体はできておりません。 申し訳ございませんでした。 改めて出直したいと思います。 http://oshiete.goo.ne.jp/qa/7849456.html

関連するQ&A

  • EXCEL VBAでオートシェイプの重なりを検知するには?

    いつも拝見させていただいております。 教えてください。 excelのバージョンは2002です。 ひとつのオートシェイプに他のオートシェイプが重なっていた場合、重なっているオートシェイプを移動し、重ならないようにしたいのですが、どうやればよいでしょうか? Shapeオブジェクトの .Left .Top .Height .Width を駆使してチェックするしかないでしょうか? 簡単にできる方法がありましたら、お教え願います。

  • 挿入したオートシェイプが文字入力待機状態にする方法

    昨日HohoPapaさんに選択したセルとピッタリ合うオートシェイプの挿入の仕方を教えていただきました。 今度は、オートシェイプがアクティブ状態とでもいうのでしょうか、挿入後すぐにタイプしたら文字が入力できる状態にする方法を教えていただきたいです。フォントのサイズ、位置は不問で黒色で入力できればと思います。 よろしくお願いいたします。 Set shrect = ActiveSheet.Shapes.AddShape(msoShapeRectangle, _ Selection.Left, Selection.Top, Selection.Width, _ Selection.Height) shrect.Fill.ForeColor.SchemeColor = 22 'Grey 'shrect.Font.Color = vbBlack ←うまくいかなかった部分

  • VBAでオートシェイプの制御?

    エクセルマクロでセルにオートシェイプを張る方法を調べていて、ここで丁度いいのを見つけました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=808898 見つけた下記のマクロを実際にやってみました。 A1に1を入れるとB2にハートマークが出ます。 しかし、さらに2を入力してもB2のハートは削除されてくれません。 さらに1をいれると、ハートの上にハートが重なってしまいます。 1ならハート、それ以外の入力ならハートが消えるようにするにはどうすればいいのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If Target <> Range("A1") Then Exit Sub If Target.Value = 1 Then With ActiveSheet.Range("B2") ActiveSheet.Shapes.AddShape(Type:=msoShapeHeart, _ Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height).Select End With End If End Sub

  • オートシェイプの位置がずれる件について教えてください

    VBのエクセル操作で繰り返し処理を行うとオートシェイプの開始位置がずれていくのですが対処方法を教えてください。 Excel ver.2007 OS XP pro プログラム With xlSheet.Shapes.AddShape(msoShapeOval, _ xlSheet.Range("E1").left + 5, xlSheet.Range("A" & Cell_Kaigyou).top + 8, xlSheet.Range("A1").Height, xlSheet.Range("A1").Width) Cell_Kaigyou = Cell_Kaigyou + 1 'セル行数

  • オートシェイプの幅を操作するには?

    コマンドボタンにマクロを登録して、オートシェイプの幅を操作したいのですが、 とあるHPから Sub WIDTH_ADD() Selection.ShapeRange.Width = Selection.ShapeRange.Width + 1 End Sub というマクロを見付けました。 ただ、これでは1ずつしか広がりません。 決まったセルに入れた数字分、増加させるにはどのようにしたらよいのでしょうか? 例えば セルA1に10と入力すれば、10増えると言う具合にです。 もしくは、増減させるのではなく幅にあたる数値をセルに入力することによって 幅を自由に変更する方法はありませんでしょうか? 良い方法がありましたらお願いします。

  • オートシェイプの位置

    エクセルですが。 セレクトされているオートシェイプを所定の位置に配置するマクロとして、以下は動作するのですが。 Selection.ShapeRange.Left = 250 Selection.ShapeRange.Top = 100 名前ボックスからオートシェイプの名前を aaa に変更し、以下のマクロを実行すると、いずれもエラーになってしまいます。 aaa.ShapeRange.Left = 250 aaa.ShapeRange.Top = 100 aaa.Left = 250 aaa.Top = 100 どこが間違っているのでしょうか?

  • オートシェイプの図形の高さ、幅をマクロで変えたい

    エクセルのオートシェイプで図形を作って、それをグループ化して、 A1(縦)A2(横)のセルへ数値を入力するとシート1上にあるオートシェイプの長さと幅が変化するようにしたいのです。マクロで出来るでしょうか。 シート上の図形は、Group25 です。 エクセル2010を使用しています。 よろしくお願いします。

  • vbaでオートシェイプを変形させたい

    今月入ってVBAの勉強を始めた者です。 勉強にと、webで見つけた工程表のコードを読みながら作りたいモノへ改良しようとおもったのですがうまく行きません。 C列:開始日 D列:終了日 E2~月 E3~日 E4~曜日 E5~オートシェイプ描画欄 開始日と終了日を入力すると矢印が作成・変更される。 という仕様になっていますが、1日からの開始だと矢印が2日多く先まで矢印が引かれてしまい、終了日がズレてしまいます。2日以降の開始日であればズレないのですが、どこを直したらよいでしょうか。  また、表の最終列が変化するのですが、ForNext関数を使用する際、その変化に対応させたいのですがどのようにしたらよいでしょう。 コードは下記の様です。宜しくお願い致します。 Private Sub Worksheet_SelectionChange(ByVal target As Range) ' 工程ライン作成 Const ORG_DATE As Date = #4/1/2012# '開始年月日 Dim myDate As Date '処理中の日付を表す変数 Dim X1 As Single Dim Y1 As Single Dim X2 As Single Dim Y2 As Single Dim kiten As Range Dim Kikan As Long Dim Start As Long Dim i As Long If target.Column = Range("C:D").Column Then myDate = ORG_DATE On Error Resume Next For i = 5 To 30 ActiveSheet.Shapes("KOUTEIline " & i).Delete Next i For i = 5 To 30 Start = Cells(i, 3).Value - myDate Kikan = Cells(i, 4).Value - Cells(i, 3).Value X1 = Range(Cells(1, 1), Cells(1, 4 + Start)).Width Y1 = Range(Cells(1, 1), Cells(i - 1, 1)).Height + Cells(i, 1).Height / 2 X2 = X1 + Range(Cells(i, 4 + Start), Cells(i, Start + 4 + Kikan)).Width Y2 = Y1 With ActiveSheet.Shapes.AddLine(X1, Y1, X2, Y2) .Name = "KOUTEIline " & i .Line.EndArrowheadStyle = msoArrowheadTriangle .Line.Interior.Color = vbRed .Line.Weight = 4 End With Next i End If End Sub

  • リキッドデザイン3カラム左端幅固定の個別スクロール

    現在、リキッドデザインで幅3カラムのレイアウトをしようとしています。 左端のみ幅を178pxに固定し、中央と右のブロックはそれぞれ残りの画面を二分割し、最低幅401pxで制作した上に、それぞれのカラムを個別にスクロールさせようと考えています。 以下のコーディングでFirefoxとChrome、Safariでは想定したレイアウトを概ね実現できたのですが(厳密には中央と右のサイズが微妙に異なっていて調整できていません)、IE9以下は全てレイアウトが崩れて表示されてしまいます。 IE6はともかくとしても、IE7以降で崩れずにレイアウトを完成させる方法は無いでしょうか。 さらに欲を言えば中央と右カラムを完全に二分割のサイズにできるとありがたいです。 (こちらはできればで結構ですが。。。) おわかりいただける方、お知恵をお借りできないでしょうか。 ご迷惑をおかけしますが、よろしくお願いいたします。 ------------html------------ <div id="wrap"> <div id="contents"> <div id="wall"> <div id="nav"> 左ブロック </div> <div id="main"> 中央ブロック </div> </div> <div id="sub"> 右ブロッック </div> </div> </div> ---------------------------- ------------css------------ #wrap{ width:100%; text-align:left; min-height: 100%; font-size: 100%; } #contents{ position:fixed; overflow:auto; width:100%; min-width:980px; height:100%; margin-top:60px; } #wall{ position:fixed; overflow:auto; width:60%; min-width:579px; height:100%; } #nav{ position:fixed; overflow:auto; left:0px; width:178px; height:100%; } #main{ width:100%; min-width:401px; height:100%; margin-left:178px; } #sub{ width:40%; min-width:401px; height:100%; margin-left:60%; } ----------------------------

    • ベストアンサー
    • CSS
  • VBA シート上のボタンクリックしたら実行

    お世話になっております。 シート上に、予定1、予定2…        実際1、実際2… という名前で作成したオートシェイプがあります。 このオートシェイプをクリックしたら、 既にあるオートシェイプ(矢印)を消し、 オートシェイプ(矢印)を作成するというものをしたいと思っています。 -------------------------- Sub Test() Dim TESTShape As Shape Dim i As Long Dim j As Long j = 1 For i = 5 To 64 With ActiveSheet.Range("J" & i) If i Mod 2 = 1 Then '2で割って余りが1なら Set TESTShape = ActiveSheet.Shapes.AddShape( _ msoShapeRectangle, _ Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) TESTShape.Fill.Visible = msoTrue TESTShape.Select Selection.ShapeRange.Fill.ForeColor.SchemeColor = 41 TESTShape.Name = "予定" & j ' Else Set TESTShape = ActiveSheet.Shapes.AddShape( _ msoShapeRectangle, _ Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) TESTShape.Name = "実際" & j ' j = j + 1 End If End With Next End Sub -------------------------- 上記プログラムで、シート上にボタンを作成しました。 そのシートに直接プログラムを書き込み? Private Sub 予定1_Click() MsgBox "TEST" End Sub と試してみていますが、オートシェイプから シートプログラム?の実行はできないのでしょうか。 このシートは色んなシートにコピーして使おうと思っているため、 ボタンをおしたら矢印を消したり、追加したりする動作も他のブックにコピーしたいと思っています。 そのためシートに書き込もうとしているのですが、上手く行かず… 根本的に、なにか間違っているかもしれません。 シートに書き込むプログラムをどう書くべきなのかあまり良くわかっておりません…。 シート上のボタンをクリックしたら実行できるのは、 標準モジュールに書き込んだプログラムのみなのでしょうか? 質問がわかりにくく、説明不足の点も多々あるかもしれません。 その場合は、どんどん聞いてください。お願いします。 回答お待ちしております。

専門家に質問してみよう