Excel2021 にて とあるデータ入力フォーマットを作成中です。
1ページ目は数行の入力ページがあるのですが
1ページで収まるとは限らないため、2ページ目以降を作成する際はボタンを押下すると
VBAで2ページ目を作成し、特定の行に計算式や枠線を配置し、3ページ目を作成するためのボタンをA列の最下行に自動で生成するというコードを作成しました。
下記に実際のコードと実行結果の画像が記載されているのですが
実行をするとボタンの位置が最下行ではなく、変な位置に出力されてしまい、解決方法がわからず困っています。
Dim Act_sheet As Object Dim button_y, button_x As Integer Dim current_raw As Integer Static downfirst, downlast As Integer downfirst = 29 downlast = 53 button_x = downlast + 1 button_y = downlast + 1 Set Act_sheet = Worksheets(2) 'フッターにページ番号を挿入する With ActiveSheet.PageSetup .CenterFooter = "&P/&N" End With '2番目のワークシートに格子状の枠線を記載する。 Act_sheet.Range(Cells(downfirst, 1), Cells(downlast, 7)).Borders.LineStyle = True 'C列とE列の最後列まで掛け算の式を代入 current_raw = downfirst While current_raw <= downlast Cells(current_raw, 6).Value = "=$C" & current_raw & "*$E" & current_raw Cells(current_raw, 5).NumberFormatLocal = "\#,##0" Cells(current_raw, 6).NumberFormatLocal = "\#,##0" current_raw = current_raw + 1 Wend '次のページ最下行にボタンを生成する。 With Act_sheet.Buttons.Add(Cells(button_y, 1).Left, _ Cells(button_y, 1).Top, _ Cells(button_y, 1).Width, _ Cells(button_y, 1).Height) .OnAction = "Pagemake_since2" .Characters.Text = "次のページ" End With End Sub
下記、画像の28行目のボタンは手動で配置しており、これをクリックすると
上記のコードが走り、29~53行目まで計算式と枠線を配置します。
このボタン配置を 54行目、80行目、96行目というように正確に配置するにはどのようにコードを修正したらよいでしょうか。
54,80,96の繰り上がりは動的に行う必要があると考えているので
静的変数に加算していく設計になっています。
なので、現状Rangeで指定するやり方は不可だと考えております。
回答をお願い致します。
@tennkさん
追加の説明はこの欄ではなく質問に追記してください。(質問は編集できます)
button_yで指定した行にボタンが作成されるようですが何が問題なのでしょうか?現状51行目にボタンが作成されますがこの位置を変えたいならbutton_yの数字を変更すれば良いかと思いますが何か違うのでしょうか?
button_y = downlast + 2 ですが
こちら、button_y = downlast + 1の間違いでした。
Cells(54,1)となるので A列54行目にボタンが表示されるはずなのですが
わずかにボタンの座標がズレていたり、画面のスクロールでボタンが望んだ位置に表示はされますがカーソルを合わせてもカーソルが変化せずボタンをクリックができないという状態になってしまいます。
こちらで(Excel2021 )簡単に試したところでは問題はないようでした。
Act_sheet と ActiveSheet は別シートですか?
もしそうなら、ボタンの位置を指定する箇所もAct_sheetを明示して
Act_sheet.Buttons.Add(Act_sheet.Cells(button_y, 1).Left, _ ...
とかにしないとズレてしまいそうです。
@meg_
ありがとうございます。
私の方でもverは異なりますが別のpcのExcelで実施したところ変わらず位置ズレが発生しました。
コード中に下記のコメントがありますが、
'2番目のワークシートに格子状の枠線を記載する。
ひょっとすると、ボタンのあるシートとは別のシートに枠線やボタンを追加するのですか。
@jinoji
ありがとうございます。
いえ、Act_sheetとActiveSheetは同じシートになります。
明示的にAct_sheetへ格納しておいた方が良いかと考えたのでオブジェクト型で変数を用意しています。
仰るやり方で実行してみましたがやはり、位置ズレが発生してしまいました。
@hatena19
ありがとうございます。
はい、その通りです。
1ページ目に配置されたボタンを押すことで2ページ目(画像の29行目から53行目)に格子状の枠線を入力し、A列54行目に3ページ目を作成するためのボタンを配置する
といった流れになっています。これをボタンを押した回数だけ繰り返すといった流れです。
1ページ目に配置されたボタンがあるのは、ActiveSheet ですよね。
「2ページ目(画像の29行目から53行目)」というのも同じActiveSheetですか。
それとも別のシート(2番目のシート, Sheets(2) ?)ですか。
画像を見るかぎりは同じシート(ActiveSheet)に見えますが。
@hatena19
同じActiveSheetになります。
1シートに別のシートが有り、2シート目が画像のシートとなっているので
Set Act_sheet = Worksheets(2) と明示的に格納しています。
「1シートに別のシートが有り」
日本語としておかしいですよ。
シートとページを混同してませんか。
1シートに、1ページ目、2ページ目・・・があるということではないのですか。
一つ目のシートに1ページ目、2つ目のシートに2ページ目・・・ということではないですよね。
@hatena19
失礼しました。
1シート目は別のシートで
2シート目が画像、およびActiveSheetとなっております。
1シートに、1ページ目、2ページ目・・・ が正しいです。
一つのシートに「次のページ」ボタンが配置してあり、そのボタンをクリックするとボタンの下の行から、
24行7列の表罫線を表示して、その表の下に「次のページ」ボタンを表示(移動)するということなら、
私の回答を参照ください。

回答3件
あなたの回答
tips
プレビュー