質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.32%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

215閲覧

複数テキストボックス挿入時のテキストを変数として入力したい。

hajihaji

総合スコア24

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2025/03/02 23:27

実現したいこと

ガントチャートを作成しており、カレンダーの日付に合わせたサイズのテキストボックスを複数挿入するところまではうまくいったのですが、各テキストボックスの中のテキスト(文字)を変数として設定し、それぞれに挿入することがうまくいかないのでこれを実現したいと考えています。アドバイスいただけますと幸いです。

発生している問題・分からないこと

With .TextFrame
.Characters.Text = x
のxに変数として設定し、一応認識しているようですが、挿入した複数のテキストボックスすべてに最下行の文字列が挿入されております。

該当のソースコード

Sub テキストボックス() Application.ScreenUpdating = False Application.Cursor = xlWait Application.EnableEvents = False Application.DisplayAlerts = False Application.Calculation = xlCalculationManual Dim sh1 As Worksheet Set sh1 = Worksheets("Gantt") Dim b, S, E, i b = sh1.Range("Q4") For i = 7 To sh1.Cells(Rows.Count, "M").End(xlUp).row If Cells(i, "M") <> "" And Cells(i, "N") <> "" Then Set S = sh1.Cells(i, "Q").Offset(0, DateDiff("d", b, Cells(i, "M"))) Set E = sh1.Cells(i, "Q").Offset(0, DateDiff("d", b, Cells(i, "N"))) Call 挿入(S, E) End If Next Application.StatusBar = False Application.Calculation = xlCalculationAutomatic Application.DisplayAlerts = True Application.EnableEvents = True Application.Cursor = xlDefault Application.ScreenUpdating = True End Sub Sub 挿入(S, E) Application.ScreenUpdating = False Application.Cursor = xlWait Application.EnableEvents = False Application.DisplayAlerts = False Application.Calculation = xlCalculationManual Set sh1 = Worksheets("Gantt") Dim i As Long For i = 7 To sh1.Cells(Rows.Count, "B").End(xlUp).row x = sh1.Cells(i, "B").value With sh1.Shapes.AddTextbox(msoTextOrientationHorizontal, S.Left, S.Top, (E.Left + E.Width) - S.Left, E.Height) With .TextFrame .Characters.Text = x .Characters.Font.Color = RGB(0, 0, 0) .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With With .Fill .ForeColor.ObjectThemeColor = msoThemeColorAccent1 .ForeColor.Brightness = 0.800000011 End With End With Next i Application.StatusBar = False Application.Calculation = xlCalculationAutomatic Application.DisplayAlerts = True Application.EnableEvents = True Application.Cursor = xlDefault Application.ScreenUpdating = True End Sub

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

x = sh1.Cells(i, "B").valueかxの書く位置が悪いのではないかといろいろ変更しましたがうまくいきません。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sk.exe

2025/03/03 05:02

> Set sh1 = Worksheets("Gantt") ワークシート[Gantt]の構造、およびそれを前提とした自動処理の仕様が不明瞭です。 > b = sh1.Range("Q4") ・Q4 セルは何の値を入力するためのセルか。 > For i = 7 To sh1.Cells(Rows.Count, "M").End(xlUp).row > Set S = sh1.Cells(i, "Q").Offset(0, DateDiff("d", b, Cells(i, "M"))) > Set E = sh1.Cells(i, "Q").Offset(0, DateDiff("d", b, Cells(i, "N"))) > For i = 7 To sh1.Cells(Rows.Count, "B").End(xlUp).row ・7行目以降の B 列、M 列、N 列および Q 列のセルのそれぞれの役割は何なのか。 > 各テキストボックスの中のテキスト(文字)を変数として設定し、それぞれに挿入する ・作成したテキストボックスに代入したいのはどんな文字列なのか。  また、何のために変数を使用するのか。 とりあえず、以上の点について具体的に明記されることをお奨めします。
hajihaji

2025/03/03 07:25

言葉足らずですみません。 > Set sh1 = Worksheets("Gantt") ワークシート[Gantt]の構造、およびそれを前提とした自動処理の仕様が不明瞭です。 > b = sh1.Range("Q4") ・Q4 セルは何の値を入力するためのセルか。 A: Q4から横軸に日別のカレンダーを配置しています。 > For i = 7 To sh1.Cells(Rows.Count, "M").End(xlUp).row > Set S = sh1.Cells(i, "Q").Offset(0, DateDiff("d", b, Cells(i, "M"))) > Set E = sh1.Cells(i, "Q").Offset(0, DateDiff("d", b, Cells(i, "N"))) > For i = 7 To sh1.Cells(Rows.Count, "B").End(xlUp).row ・7行目以降の B 列、M 列、N 列および Q 列のセルのそれぞれの役割は何なのか。 A: B=名称 M=日付 N=日付 > 各テキストボックスの中のテキスト(文字)を変数として設定し、それぞれに挿入する ・作成したテキストボックスに代入したいのはどんな文字列なのか。  また、何のために変数を使用するのか。 A: 挿入したいのは文字列です。変数を使用したいのは挿入箇所(位置)に対応した文字列がそれぞれ異なるためです。 とりあえず、以上の点について具体的に明記されることをお奨めします。
guest

回答2

0

ベストアンサー

挿入プロシージャ内でテキストボックス挿入を行数分繰り返しているので、前のテキストボックスの上に後のテキストボックスが重ねて配置されてます。ですので、最後の文字列のテキストボックスが一番前面にくるのでそれが表示されているように見えます。一番上のテキストボックスを削除するその下にテキストボックスがあるのが分かると思います。

挿入プロシージャ内のループは必要ないです。挿入するテキストは開始セルの行のB列(sh1.Cells(S.Row, "B").Value)にすればいいでしょう。

vba

1Sub 挿入(S, E) 2' ↓デバッグ中はコメントアウトしておく。動作が確認出来たら、コメントを外す。 3' Application.ScreenUpdating = False 4' Application.Cursor = xlWait 5' Application.EnableEvents = False 6' Application.DisplayAlerts = False 7' Application.Calculation = xlCalculationManual 8 9 Dim sh1 As Worksheet 10 Set sh1 = Worksheets("Gantt") 11 Dim x 12 x = sh1.Cells(S.Row, "B").Value 13 With sh1.Shapes.AddTextbox(msoTextOrientationHorizontal, S.Left, S.Top, (E.Left + E.Width) - S.Left, E.Height) 14 With .TextFrame 15 .Characters.Text = x 16 .Characters.Font.Color = rgb(0, 0, 0) 17 .HorizontalAlignment = xlHAlignCenter 18 .VerticalAlignment = xlVAlignCenter 19 End With 20 With .Fill 21 .ForeColor.ObjectThemeColor = msoThemeColorAccent1 22 .ForeColor.Brightness = 0.800000011 23 End With 24 End With 25 ' Application.StatusBar = False 26 ' Application.Calculation = xlCalculationAutomatic 27 ' Application.DisplayAlerts = True 28 ' Application.EnableEvents = True 29 ' Application.Cursor = xlDefault 30 ' Application.ScreenUpdating = True 31End Sub 32 33

投稿2025/03/03 04:52

編集2025/03/03 04:55
hatena19

総合スコア34292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Q4から横軸に日別のカレンダーを配置

B=名称 M=日付 N=日付

vba

1Sub CreateGanttBars() 2On Error GoTo Err_CreateGanttBars 3 4 Dim wsTarget As Worksheet 5 6 Set wsTarget = ThisWorkbook.Worksheets("Gantt") 7 8 Dim lngDateHeaderRow As Long 9 Dim lngFirstWorkRow As Long 10 Dim lngLastWorkRow As Long 11 Dim rngFirstDate As Range 12 Dim rngLastDate As Range 13 14 With wsTarget 15 16 lngFirstWorkRow = 7 17 lngLastWorkRow = .Cells(.Rows.Count, "M").End(xlUp).Row 18 19 If lngFirstWorkRow > lngLastWorkRow Then 20 MsgBox "作業開始日が入力されているタスクがありません。", vbInformation, "終了" 21 Set wsTarget = Nothing 22 Exit Sub 23 End If 24 25 lngDateHeaderRow = 4 26 Set rngFirstDate = .Cells(lngDateHeaderRow, "Q") 27 '最後の日付セルを固定で指定する場合は適宜書き換えること 28 Set rngLastDate = .Cells(lngDateHeaderRow, .Columns.Count).End(xlToLeft) 29 30 If rngFirstDate.Column > rngLastDate.Column Then 31 MsgBox "工程期間が設定されていません。", vbInformation, "終了" 32 Set rngFirstDate = Nothing 33 Set rngLastDate = Nothing 34 Set wsTarget = Nothing 35 Exit Sub 36 End If 37 38 .Select 39 40 End With 41 42 If IsDate(rngFirstDate.Value) = False Then 43 MsgBox "工程管理期間の開始日を正しく入力してください。", vbExclamation, "エラー" 44 rngFirstDate.Select 45 Set rngFirstDate = Nothing 46 Set rngLastDate = Nothing 47 Set wsTarget = Nothing 48 Exit Sub 49 End If 50 51 If IsDate(rngLastDate.Value) = False Then 52 MsgBox "工程管理期間の終了日を正しく入力してください。", vbExclamation, "エラー" 53 rngLastDate.Select 54 Set rngFirstDate = Nothing 55 Set rngLastDate = Nothing 56 Set wsTarget = Nothing 57 Exit Sub 58 End If 59 60 Dim lngWorkRow As Long 61 Dim strTaskName As String 62 Dim rngStartWorkDate As Range 63 Dim rngEndWorkDate As Range 64 Dim lngStartOffset As Long 65 Dim lngEndOffset As Long 66 Dim rngStartDraw As Range 67 Dim rngEndDraw As Range 68 Dim rngDrawArea As Range 69 Dim shpGantBar As Shape 70 71 With Application 72 .StatusBar = "ガントバーの作成処理中です..." 73 .ScreenUpdating = False 74 .Cursor = xlWait 75 .EnableEvents = False 76 .DisplayAlerts = False 77 .Calculation = xlCalculationManual 78 End With 79 80' 'シート上の全ての図形を削除する場合は有効化 81' wsTarget.Shapes.SelectAll 82' Selection.Delete 83 84 For lngWorkRow = lngFirstWorkRow To lngLastWorkRow 85 86 strTaskName = wsTarget.Cells(lngWorkRow, "B").Value 87 Set rngStartWorkDate = wsTarget.Cells(lngWorkRow, "M") 88 Set rngEndWorkDate = wsTarget.Cells(lngWorkRow, "N") 89 90 If IsDate(rngStartWorkDate.Value) Then 91 If rngStartWorkDate.Value < rngFirstDate.Value Then 92 Set rngStartDraw = wsTarget.Cells(lngWorkRow, rngFirstDate.Column) 93 ElseIf rngStartWorkDate.Value > rngLastDate.Value Then 94 Set rngStartDraw = Nothing 95 Else 96 lngStartOffset = DateDiff("d", rngFirstDate.Value, rngStartWorkDate.Value) 97 Set rngStartDraw = wsTarget.Cells(lngWorkRow, rngFirstDate.Column) _ 98 .Offset(0, lngStartOffset) 99 End If 100 Else 101 Set rngStartDraw = Nothing 102 End If 103 104 If IsDate(rngEndWorkDate.Value) Then 105 If rngEndWorkDate.Value < rngFirstDate.Value Then 106 Set rngEndDraw = Nothing 107 ElseIf rngEndWorkDate.Value > rngLastDate.Value Then 108 Set rngEndDraw = wsTarget.Cells(lngWorkRow, rngLastDate.Column) 109 Else 110 lngEndOffset = DateDiff("d", rngFirstDate.Value, rngEndWorkDate.Value) 111 Set rngEndDraw = wsTarget.Cells(lngWorkRow, rngFirstDate.Column) _ 112 .Offset(0, lngEndOffset) 113 End If 114 Else 115 Set rngEndDraw = Nothing 116 End If 117 118 If (Not rngStartDraw Is Nothing) And (Not rngEndDraw Is Nothing) Then 119 If rngStartWorkDate.Value > rngEndWorkDate.Value Then 120 Set rngDrawArea = Nothing 121 Else 122 Set rngDrawArea = wsTarget.Range(rngStartDraw, rngEndDraw) 123 End If 124 End If 125 126 If Not rngDrawArea Is Nothing Then 127 128 Debug.Print "工程名: " & strTaskName 129 Debug.Print vbTab & "作業開始日: " & rngStartWorkDate.Value 130 Debug.Print vbTab & "作業終了日: " & rngEndWorkDate.Value 131 Debug.Print vbTab & "描画領域: " & rngDrawArea.Address 132 133 Set shpGantBar = wsTarget.Shapes.AddTextbox(msoTextOrientationHorizontal, _ 134 rngDrawArea.Left, _ 135 rngDrawArea.Top, _ 136 rngDrawArea.Width, _ 137 rngDrawArea.Height) 138 With shpGantBar 139 With .TextFrame 140 .Characters.Text = strTaskName 141 .Characters.Font.Color = RGB(0, 0, 0) 142 .HorizontalAlignment = xlHAlignCenter 143 .VerticalAlignment = xlVAlignCenter 144 End With 145 With .Fill 146 .ForeColor.ObjectThemeColor = msoThemeColorAccent1 147 .ForeColor.Brightness = 0.800000011 148 End With 149 End With 150 151 Set shpGantBar = Nothing 152 End If 153 154 Set rngDrawArea = Nothing 155 Set rngStartDraw = Nothing 156 Set rngEndDraw = Nothing 157 158 Set rngStartWorkDate = Nothing 159 Set rngEndWorkDate = Nothing 160 Next 161 162Exit_CreateGanttBars: 163 164 Set rngFirstDate = Nothing 165 Set rngLastDate = Nothing 166 Set wsTarget = Nothing 167 168 With Application 169 .StatusBar = False 170 .Calculation = xlCalculationAutomatic 171 .DisplayAlerts = True 172 .EnableEvents = True 173 .Cursor = xlDefault 174 .ScreenUpdating = True 175 End With 176 177 Exit Sub 178 179Err_CreateGanttBars: 180 181 Dim strErrTitle As String 182 Dim strErrMsg As String 183 184 strErrTitle = "実行時エラー (CreateGanttBars)" 185 strErrMsg = Err.Number & ": " & Err.Description 186 187 Debug.Print strErrTitle 188 Debug.Print strErrMsg 189 190 MsgBox strErrMsg, vbCritical, strErrTitle 191 192 Resume Exit_CreateGanttBars 193End Sub

投稿2025/03/03 10:18

編集2025/03/03 10:22
sk.exe

総合スコア1034

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.32%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問