エクセルのマクロについて

このQ&Aのポイント
  • エクセル2010を使用して、工程表を作成するためのマクロ作成に苦戦しています。
  • マクロを実行すると選択したセルに線を引き、テキストボックスで文字を入力できるようにするマクロを作成したいです。
  • テキストボックスの挿入、入力待機、入力後の大きさ自動調整についてのマクロがわかりません。また、任意の選択したセルの中央に配置したいです。
回答を見る
  • ベストアンサー

エクセルのマクロについて

エクセル2010を使用しています。 工程表を作成するため、以下のマクロを組もうと苦戦しています。 任意のセルを選択し、マクロを実行すると選択したセルに線を引き 線の上部にテキストボックスで文字を入力できるようにするマクロを 作成しようとしています。 また、テキストボックスは文字入力後、大きさの自動調整をかけようと しています。 線を引くところまでは、うまくいったのですがテキストボックスの挿入→入力待機 →入力後、大きさの自動調整(幅)までのマクロがよくわかりません。 可能であれば、任意の選択したセルの中央に配置をしたいです。 お知恵をお貸しください。よろしくお願いします。 koutei() Dim SentakuTop As Single Dim SentakuLeft As Single Dim SentakuWidth As Single Dim SentakuHeight As Single Dim SentakuAddress As String Dim X0, Y0, X1, Y1 As Variant SentakuAddress = Selection.Address(ColumnAbsolute:=False, RowAbsolute:=False) With ActiveSheet.Range(SentakuAddress) SentakuTop = .Top SentakuLeft = .Left SentakuWidth = .Width SentakuHeight = .Height End With X0 = SentakuLeft Y0 = SentakuTop + SentakuHeight / 2 X1 = SentakuLeft + SentakuWidth Y1 = Y0 With ActiveSheet.Shapes.AddLine(X0, Y0, X1, Y1).Line .ForeColor.RGB = RGB(0, 0, 0) .Weight = 1 .BeginArrowheadStyle = msoArrowheadOval .EndArrowheadStyle = msoArrowheadOval End With End Sub

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

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

よく検討してみると、テキストボックスの幅が選択セル幅より広くても狭くても同じマクロになります。 sub kouteir1() Dim SentakuTop As Single Dim SentakuLeft As Single Dim SentakuWidth As Single Dim SentakuHeight As Single Dim SentakuAddress As String Dim X0, Y0, X1, Y1 As Variant  dim s1 as shape  dim s2 as shape  dim txt as string SentakuAddress = Selection.Address(ColumnAbsolute:=False, RowAbsolute:=False) With ActiveSheet.Range(SentakuAddress) SentakuTop = .Top SentakuLeft = .Left SentakuWidth = .Width SentakuHeight = .Height End With X0 = SentakuLeft Y0 = SentakuTop + SentakuHeight / 2 X1 = SentakuLeft + SentakuWidth Y1 = Y0  set s1 = ActiveSheet.Shapes.AddLine(X0, Y0, X1, Y1)  With s1.Line   .ForeColor.RGB = RGB(0, 0, 0)   .Weight = 1   .BeginArrowheadStyle = msoArrowheadOval   .EndArrowheadStyle = msoArrowheadOval  End With  txt = inputbox("TEXT")  if txt = "" then exit sub  set s2 = activesheet.shapes.addtextbox(msotextorientationhorizontal, x0,y0,x1 - x0,y1 - y0)  with s2.textframe   .characters.text = txt   .horizontalalignment = xlcenter   .verticalalignment = xlcenter   .autosize = true  end with  s2.top = s1.top - s2.height  s2.left = s1.left - (s2.width - s1.width) / 2 End Sub

konkichikonkon
質問者

お礼

回答が遅くなりすみません。 ばっちりです。 ありがとうございました。

その他の回答 (1)

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

せっかくココまで出来たのですから、もう一歩、考えてみませんか? というわけで、とりあえずヒントです。 まず、「テキストボックスの挿入~テキストボックスの大きさの調整」は マクロの記録機能で録れますね。 テキストボックス内での横方向の中央揃えも忘れずに。 それをちょこっと手直ししてやりましょう。 基本的には直線と同じ感覚でできますから、 記録されたモノを見ればきっとわかります。 で、問題は「位置の調整」ですね。 テキストボックスよりも該当セルの方が大きいと仮定して・・ 例えば、「セルの横幅からテキストボックスの横幅を引く」とどうなるでしょう? 「セル内における幅(横=左右)方向の余白の“合計”」を求められますね。 と言うことは、これを「2で割る」と、「左余白」だけを求められます。 現状のコードで「SentakuWidth = .Width」を使って「セルの幅」は取れていますね。 と言うことは、あとは「テキストボックスの幅」を取ってやれば計算が出来そうです。 最終的に、「セルの左端の座標+セル内での左余白」を計算してやれば、 「テキストボックスの左端の座標」も求められるわけですね。 位置の調整自体は「直線の位置指定」と同様です。 上下余白についても同様に計算・設定できます。 頑張ってみるか、優しい回答者さまを待つか、判断はお任せします(笑)。

konkichikonkon
質問者

お礼

回答が遅くなりすみません。 ヒントありがとうございます。 頭の考え方をもう少し柔らかくしてみます。 ありがとうございます。

関連するQ&A

  • Excelの罫線に関するマクロ

    Excelの罫線に関するマクロ 罫線を引き、それを赤くするマクロを作ったのですが、赤罫線の下にもうひとつ罫線が表示されてしまいます。どこを削除すればよいのでしょうか。 ご教示お願いいたします。 Sub 罫線() Dim T1 As Single, L1 As Single Dim T2 As Single, L2 As Single Dim myShp As Shape With Range("c15") T1 = .Top L1 = .Left End With With Range("d14") T2 = .Offset(1, 1).Top L2 = .Offset(1, 1).Left End With Set myShp = ActiveSheet.Shapes.AddLine(L1, T1, L2, T2) ActiveSheet.Shapes.AddLine(L1, T1, L2, T2).Select With Selection.ShapeRange.Line .Visible = msoTrue .Style = msoLineSolid .Weight = 5# .ForeColor.SchemeColor = 10 End With End Sub よろしくお願いします。

  • エクセルのマクロ

    エクセルに 1、コマンドボタンを押す 2、貼り付けたいテキストファイルを選ぶ →B3のセルから貼り付ける というマクロを組みました 以下のマクロがそうなんですが、 このマクロだと1つのテキストファイルしか貼り付けれません 2回目以降も貼り付けを同じボタンで繰り返し その前に貼り付けたデータのB列最終セルの一つ下のセルから 同じようにテキスト貼り付けを行えるようにはすることは可能でしょうか? Private Sub CommandButton1_Click() Dim fd As FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) Dim vrtSelectedItem As Variant With fd Dim txtpass As Variant If .Show = -1 Then  For Each vrtSelectedItem In .SelectedItems txtpass = "TEXT;" & vrtSelectedItem Next vrtSelectedItem Else End If End With With ActiveSheet.QueryTables.Add(Connection:= _ txtpass, Destination:=Range("$B$3")) .Name = "4" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = False .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 932 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 _ , 1, 1, 1, 1, 1, 1, 1, 1) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With End Sub

  • マクロでエクセルに表示される座標を基準に矢印を引く

    ガントチャートをエクセルで作成しているのですが、 それぞれのタスクの関係性がわかるよう、 関係元タスクの終点と、関係先タスクの始点を矢印で結びたいと思っています。 タスクリンクの始点終点に入力された数字を参照して、同じ数字の組み合わせを見つけ出し、 右側に関数で表示されている座標数値を参照させて矢印を引きたいと考えています。 ※座標数値はタスクの終了日を変更などで変動し、  またガントチャート側の表示基準日を変更することで参照するべきセルが消失し、座標表示が空欄になることもあります。 例)タスクリンク3番の場合、 cell(10,31)からcell(12,38)へ cell(11,38)からcell(12,38)へ   2つの矢印が引かれることを想定しています。 以下のように座標を数字指定して矢印を挿入するマクロまでは作れたのですが、 共通するタスクリンク番号を抽出し、それぞれの座標数のあてはめ、矢印の作成を最大タスクリンク番号まで引くようなマクロにしたいです。 よろしくお願いいたします。 Sub タスクリンク() Dim endX As Single, endY As Single, startX As Single, startY As Single With Cells(10, 31) endX = .Left + .Width / 2 endY = .Top + .Height / 2 End With With Cells(12, 38) startX = .Left + .Width / 2 startY = .Top + .Height / 2 End With With ActiveSheet.Shapes.AddConnector(msoConnectorElbow, endX, endY, startX, startY).Line .EndArrowheadStyle = msoArrowheadTriangle .ForeColor.RGB = RGB(255, 0, 0) .DashStyle = msoLineRoundDot .Weight = 3 End With End Sub

  • EXCEL マクロの指定の仕方

    マクロで線の色を指定したいのですが、上手くいかず困っています .ForeColor.RGB = Worksheets("sheet1").Range("F2").Interior.ColorIndex 赤色を指定したいのですがBにどういうコードを入れれば良いですか? FはVlookupで列Bより色を指定するようにしています。 マクロは始めたばかりで良く分からないので、他に必要な情報もわかりません 必要な情報なども併せて教えてください。 よろしくお願いします。 Dim rngStart As Range Dim rngEnd As Range Dim BX As Single, BY As Single, EX As Single, EY As Single Set rngStart = Worksheets("sheet2").Cells.Find(What:=Worksheets("sheet1").Range("D2"), LookIn:=xlValues, LookAt:=xlWhole) Set rngEnd = Worksheets("sheet2").Cells.Find(What:=Worksheets("sheet1").Range("E2"), LookIn:=xlValues, LookAt:=xlWhole) BX = rngStart.Left BY = rngStart.Top EX = rngEnd.Left + rngEnd.Width EY = rngEnd.Top With Worksheets("sheet2").Shapes.AddLine(BX, BY + 10, EX, EY + 10).line .ForeColor.RGB = Worksheets("sheet1").Range("F2").Interior.ColorIndex .Weight = 3 .EndArrowheadStyle = msoArrowheadTriangle End With

  • Excel2003のマクロで複数の罫線を引きたい

    Excel2003のマクロで複数の罫線を引きたい 本日(3月2日)の午前中に罫線のVBAに関する質問をして解決したのですが、今度は複数のセルにわたる罫線を複数引きたいのですが、ご教示お願いいたします。 Sub 罫線() Dim T1 As Single, L1 As Single Dim T2 As Single, L2 As Single Dim myShp As Shape With Range("c15") T1 = .Top L1 = .Left End With With Range("d14") T2 = .Offset(1, 1).Top L2 = .Offset(1, 1).Left End With Set myShp = ActiveSheet.Shapes.AddLine(L1, T1, L2, T2) ActiveSheet.Shapes.AddLine(L1, T1, L2, T2).Select With Selection.ShapeRange.Line .Visible = msoTrue .Style = msoLineSolid .Weight = 5# .ForeColor.SchemeColor = 10 End With End Sub このコードで(14行目と15行目の間、C列からD列)に赤の太線が表示されるようになりました。 さらにこれに加えて一度で、この罫線プラスA列の10行目からC列の14行目に引く罫線を加えたいのですが 上記コードにどのように書きくわえれば良いのでしょうか。 たびたびですみませんが、ご教示よろしくお願いいたします。

  • マクロで線に色をつけるには

    WINDOWS XP EXCELL2003です。 現在、下記のマクロがあります。 それに追加として「赤の線の色」を追加したいのです。(.ColorIndex = 3) いろいろトライを試みましたがうまくいきません。 恐れ入りますがご指導いただけませんでしょうか。 よろしく御願いします。 Sub yokosen_chuuou() Dim yokohaba As Single, tatehaba As Single Dim yoko As Double, takasa As Double Dim shita As Double, migi As Double Dim futosa As Single, mannaka As Double On Error GoTo trap futosa = Val(InputBox("太さを指定してください?", "整数入力", 1)) tatehaba = Selection.Height takasa = ActiveCell.Top shita = takasa + tatehaba yoko = ActiveCell.Left yokohaba = Selection.Width migi = yoko + yokohaba mannaka = (shita - takasa) / 2 + takasa ActiveSheet.Shapes.AddLine(yoko, mannaka, migi, mannaka).Select With Selection .ShapeRange.Line.Weight = futosa .Placement = xlMoveAndSize End With trap: End Sub

  • 画像をマクロでエクセルシートに貼り付けるには

    画像をマクロを使ってエクセルシートに貼り付けようとしています。 2つ質問があります。 下記のマクロをベースとして。 (1)画像の縦横比を固定のまま、貼り付けたい。LockPictureAspectRatio=msoTrueだろうと思うのですが、見つかりません。    LockPictureAspectRatioは、画像のバケツボタンの fill effect/picture/select picture/insert/ から来ています。 (2)位置をセルを選んで与えたい。つまり、Cell(10,10) --> pointへの変換方法を教えて下さい。    下のマクロでは、x=100,y=100と与えていますが、これを、セルを選ぶことで与えたいのです。 Sub myMacro() Dim myPicture As String Dim a As Object myPicture = "C:\Documents and Settings\nrjito\My Documents\My Pictures\test.jpg" Set a = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 100, 100, 300, 300) a.Fill.ForeColor.RGB = RGB(255, 255, 255) a.Fill.Transparency = 0 a.LockAspectRatio = msoTrue a.Fill.UserPicture myPicture End Sub よろしくお願い致します。

  • 【エクセルのマクロ】テキストボックスが空白でもエラーが出ないようにしたい

    エクセルを使って、ユーザーフォームのテキストボックスに入力した小数点を含む数字をコピー、もし入力されていなければセルの中を消すマクロを書いていて、次のようなプログラムをテキストボックスとおなじユーザーフォームにあるボタンに取り付けました。 n3 = (n_3.Text) If n3 = Empty Then Range("j23").ClearContents Else Range("j23").Value = n_3 End If しかし、この方法だとコピーした数字が文字列として保存されてしまい、 計算に不向きなので、数字データとしてコピーするためにいちばん上の行に Dim n3 As Single と入れたところ、テキストボックスが空白の場合”型が一致しません”と表示されてエラーが出てしまいます。 調べたところ、Emptyという言葉はSingleのデータ型には使えないことまではわかったのですが、代わりにどのような言葉を使えばよいのかがわかりませんでした。 どなたかEmptyの代わりとなるような言葉か、プログラムを教えていただけないでしょうか?

  • エクセルのマクロについて

    下記は、A列3行の7文字目~10文字と B列5行~文字のある最後の行までの範囲の左から1文字目~4文字 に相違がある場合 MsgBox i & “行目” を出す。 というマクロなのですが、『B列5行~文字のある最後の行までの範囲』の中でも『空白のセルに関してはMsgBox不要』というふうに付加えたいのですがどのようにすればよいでしょうか。 Sub Macro1() Dim i As Long Dim sOrgText As String Dim ltotal As Long With ActiveSheet sOrgText = Mid(.Cells(3, 1), 7, 4) ltotal = .Cells(65536, 2).End(xlUp).Row For i = 5 To ltotal If Not Mid(.Cells(i, 2), 1, 4) = sOrgText Then MsgBox i & "行目" End If Next i End With End Sub

  • Excelのinputboxでのエラーについて

    線を引く構文を作り動作はするのですが、inputboxでウインドウの「×」や「キャンセル」ボタンを押すとエラーになるのを回避したいのですが、判りません。ご教示お願いいたします。 Sub 赤太線引き() Dim i As String i = Application.InputBox("線を伸縮できます" + Chr(13) + "数値を増してください", "オプション", 1, Type:=1) Dim T1 As Single, L1 As Single Dim T2 As Single, L2 As Single Dim myShp As Shape With Range("ah61") T1 = .Top L1 = .Left End With With Range("cg60") T2 = .Offset(1, 1).Top L2 = .Offset(1, 1).Left End With ActiveSheet.Shapes.AddLine(L1 + i, T1, L2, T2).Select With Selection.ShapeRange.Line .Visible = msoTrue .Style = msoLineSolid .Weight = 15# .ForeColor.SchemeColor = 10 Selection.ShapeRange.ZOrder msoSendToBack End With Range("bq56").Select End Sub VBAの素人ですが、×やキャンセルでは「i」が返せないのだと思います。よろしくお願い致します。 inputboxは関数でもメソッドでもどちらでもいいのですが。

専門家に質問してみよう