![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
Sheet1,2,3があり、全て同じ種類の「表」が書かれているとします。
例えばクラス名簿だとして、
Sheet1には出席番号1~10の生徒のデータ、
Sheet2には出席番号11~20の生徒のデータ、のように。
各シートのうち、違うのはデータの中身であって、
[出席番号][生徒氏名]などの項目は同じです。
この時、
Sheet1で項目名を変更した時、Sheet2、Sheet3の項目名も同時に変更させたいです。
Sheet1の[出席番号]を[No.]に変更したら、Sheet2,3の[出席番号]も自動的に[No.]に変更させたいです。
また、変更可能なのはSheet1だけでなく、Sheet2の項目を変更した時もSheet1,3の項目を自動的に変更したいです。
常にSheet1の項目を参照するのであれば、
Private Sub Workbook_SheetActivate(ByVal ActSheet As Object)
SName = "Sheet1"
Sheets(SName).Range("A4:G4").Copy'Sheet1の項目をコピー
Sheets(ActSheet.Name).Range("A4").Select
ActiveSheet.Paste'現在アクティブなシートにSheet1の項目をコピー
End Sub
で可能でした(諸事情によりセル内に「=Sheet1!A4」等と書きたくないです)。
このコードで、
参考するシート名を入れる変数SNameに「1つ前に開いていたシート名」を入れることができれば可能だと思うのですが、
そのようなデータを取得することはできるでしょうか?
よろしくお願いします。
No.6ベストアンサー
- 回答日時:
私も単純に作業グループで操作すれば良いだけだと思いますが...
> 1つ前に開いていたシート名...
というのは、「セルの変更があったシート」の内容を、それ以外の
シートに同期させる...という動作ですから、SheetChange イベントの
Sh が使えるかと思います。
値の変更のみ対応で良ければ、ThisWorkbook モジュールに下記のような
コードで。
Private Sub Workbook_SheetChange( _
ByVal Sh As Object, _
ByVal Target As Range)
Const ADDR = "A4:G4" ' 同期させるセルのアドレス
Dim S As Worksheet
If Not Intersect(Target, Sh.Range(ADDR)) Is Nothing Then
On Error GoTo ERROR_HANDLER
Application.EnableEvents = False
For Each S In ThisWorkbook.Worksheets
If Not S Is Sh Then
S.Range(ADDR).Value = Sh.Range(ADDR).Value
End If
Next
End If
TERMINATE:
Application.EnableEvents = True
Exit Sub
ERROR_HANDLER:
MsgBox Err.Description, vbCritical
Resume TERMINATE
End Sub
書式の変更等まで同期させたいなら、VBA では難しいですから、やはり
作業グループの方法をとった方が手っ取り早いでしょうね。
なお、ActiveSheet.Previous はシートタブ上での並びでアクティブ
シートの一つ前のシートを単に返すだけですから、必ずしも前回の
アクティブシートを返すとは限りません。
回答ありがとうございます。
VBAは触り始めたばかりで、挙げて頂いたコード・手法の内容を確認するのにも時間がかかりそうですので、
取り急ぎお礼だけを。
挙げていただいた内容をこれからじっくり解析します。
作業グループにして使うのもアリですが、
私個人が使うマクロではなく、他の人間に使わせたいため、避けております。
また、
使う人間の、「項目を同時変更したい」という意思、を反映させたいのではなく、
使う人間が、「1箇所変更したら他の部分も変更されていた」、という状態にしたい、
という理由もあります。
助言、ありがとうございます。
No.5
- 回答日時:
こんばんは。
>Sheet1で項目名を変更した時、Sheet2、Sheet3の項目名も同時に変更させたいです。
それは、マクロの必要はないと思いますね。
同じ内容なら、Sheet1~Sheet3 のシートタブを選択し、作業グループにして入力を行えば、すべて、同時に同じ内容に変更されます。
>また、変更可能なのはSheet1だけでなく、Sheet2の項目を変更した時もSheet1,3の項目を自動的に変更したいです。
もちろん、これも可能です。アクティベートするシートを替えるだけです。
>変数SNameに「1つ前に開いていたシート名」
On Error Resume Next
sName = ActiveSheet.Previous.Name
On Error GoTo 0
回答ありがとうございます。
>同じ内容なら、Sheet1~Sheet3 のシートタブを選択し、作業グループにして入力を行えば、すべて、同時に同じ内容に変更されます。
作ったマクロを私が使うだけならそれで問題ないのですが、
複数の人間に使ってもらう予定なので、「シートタブを選択し、作業グループにする」という手順を加えたくないのです。
また、今回は「項目を同時変更」という例を挙げましたが、
実際は、
使う人間が「全シートを同時に変更したい」と思うものではなく、
「1箇所変えたら他の部分も自動的に変わっている」ようにしたいのです。
そんな理由でマクロを選んでおります。
説明不足で申し訳ありません。
>>変数SNameに「1つ前に開いていたシート名」
ありがとうございます。
他の方の回答を含め、確認に時間がかかりそうなので(自身のスキルが足りません)、
取り急ぎお礼だけ申し上げます。
No.4
- 回答日時:
キッチリ書くなら、こんな感じかと。
Const HeaderAddress = "A4:G4"
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim r As Range
Dim i As Integer
Application.EnableEvents = False
If Target.Areas.Count = 1 Then
Set r = Intersect(Target, Range(HeaderAddress))
If Not (r Is Nothing) Then
CopyToSheets r
End If
Else
For i = 1 To Target.Areas.Count
Set r = Intersect(Target.Areas(i), Range(HeaderAddress))
If Not (r Is Nothing) Then
CopyToSheets r
End If
Next
End If
Application.EnableEvents = True
End Sub
Private Sub CopyToSheets(r As Range)
Worksheets("Sheet1").Range(r.Address).Value = r.Value
Worksheets("Sheet2").Range(r.Address).Value = r.Value
Worksheets("Sheet3").Range(r.Address).Value = r.Value
End Sub
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?a65a0e2)
No.3
- 回答日時:
No.2です。
訂正です。ThisWorkbookモジュールのどのイベントに入れるか書いてませんでした。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
If Target.Row = 1 Then
Worksheets("Sheet1").Range(Target.Address).Value = Target.Value
Worksheets("Sheet2").Range(Target.Address).Value = Target.Value
Worksheets("Sheet3").Range(Target.Address).Value = Target.Value
End If
Application.EnableEvents = True
End Sub
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?a65a0e2)
No.2
- 回答日時:
こんばんは。
各シートで項目名を変更したとき、その変更をSheet1~Sheet3に反映させたいということでいいでしょうか。
項目名が1行目にあるとします。ThisWorkbookモジュールに
Application.EnableEvents = False
If Target.Row = 1 Then
Worksheets("Sheet1").Range(Target.Address).Value = Target.Value
Worksheets("Sheet2").Range(Target.Address).Value = Target.Value
Worksheets("Sheet3").Range(Target.Address).Value = Target.Value
End If
Application.EnableEvents = True
どうでしょうか。セルに書き込む部分はシートが多い場合ループで回すという方法をとるといいでしょう。
回答ありがとうございます。
VBAは触り始めたばかりで、挙げて頂いたコード・手法の内容を確認するのにも時間がかかりそうですので、
取り急ぎお礼だけを。
挙げていただいた内容をこれからじっくり解析します。
ループで回す、という方法は、
結果的にセルに計算式を書き込むことには変わらないのですよね?
書かなかったのですが、他に
・マクロで作成したファイルをCSVで出力
・1つのシートの項目数が最大3000になる(実際作るのはクラス名簿ではありませんから)
・項目名だけでデータの無い部分はCSVに出力したくない
という条件があります。
この場合、セルに計算式を書き込むと、データの有無に関わらずCSVファイルは常に3000行で出力されてしまいました。
(データの無い行は,,,,のように「,」だけ。これが3000行)
ファイル容量が大きくなるし、無駄も多いので、これは諦めました。
的外れな返答をしていたら申し訳ありませんが、
何か巧いやり方があるのでしょうか?(いくらでもありそうで収拾つかなくなりそうですが)
No.1
- 回答日時:
>そのようなデータを取得することはできるでしょうか?
多分出来ないと思いますので、自分で変数に保存しておく必要があるでしょう。
-------------------------------
'前に開いたシートを保存する変数
Dim OldSheet As Variant
'起動時に最初のシートを設定
Private Sub Workbook_Open()
Set OldSheet = ActiveSheet
End Sub
Private Sub Workbook_SheetActivate(ByVal ActSheet As Object)
'念のためEmptyかチェック
If Not IsEmpty(OldSheet) Then
'前のシートの内容を、今のシートにコピー
OldSheet.Range("A4:G4").Copy ActSheet.Range("A4")
End If
Set OldSheet = ActSheet
End Sub
-------------------------------
こんな感じでどうでしょう?
#各ワークシートの Worksheet_Change で、処理した方が確実なような気もしますが・・・。
回答ありがとうございます。
VBAは触り始めたばかりで、挙げて頂いたコード・手法の内容を確認するのにも時間がかかりそうですので、
取り急ぎお礼だけを。
挙げていただいた内容をこれからじっくり解析します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) VBA 別sheetからの転記なのですが 2 2023/05/22 15:55
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- その他(プログラミング・Web制作) ZWCAD CUIXとLISPの関係について 1 2022/09/28 03:07
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) Excelにて、行の最後のセルの値をコピーして別sheetに張りつけるVBAコードをご教授願います 3 2022/11/20 14:35
このQ&Aを見た人はこんなQ&Aも見ています
-
今年はじめたいことは?
今年はこれをはじめたい!ということを教えてください!
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
最強の防寒、あったか術を教えてください!
とっても寒がりなのですが、冬に皆さんがされている最強の防寒、あったか術が知りたいです!
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
集中するためにやっていること
家で仕事をしているのですが、布団をはじめ誘惑だらけでなかなか集中できません。
-
excelで直前に参照していたブックに戻るマクロは作れますか?
Excel(エクセル)
-
エクセルのマクロ機能で前のシートに返るVBAはどうかくか
Excel(エクセル)
-
エクセルで、「1つ前のシート」を指定したいのです。
その他(Microsoft Office)
-
-
4
エクセル マクロ名にブック名が付いた場合の修正方法
Excel(エクセル)
-
5
EXCELのVBAでシートコピーをしたとき元のマクロを削除するには?
Excel(エクセル)
-
6
エクセルファイルを開く時、常に同じシートから開くようにするには?
Windows Vista・XP
-
7
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルでブック内の倍率がバ...
-
特定のシートのみ再計算させな...
-
ハイパーリンクでジャンプした...
-
【ExcelVBA】マクロの入ったシ...
-
エクセル、特定のシートにパス...
-
確定申告用の医療費集計フォー...
-
Excelでマクロ設定したが反映さ...
-
エクセルで複数のシートに画像...
-
エクセルでリンク貼り付けした...
-
EXCELの図形(テキストボックス)...
-
Wordで差し込み印刷時に表示す...
-
Accessのテーブルを既存のExcel...
-
エクセルのシー名を二段表示に...
-
EXCELで存在しないシート...
-
(エクセル)Indirect関数で、ハ...
-
【Excel VBA】データ貼り付け先...
-
エクセルの2つのシートを並び...
-
エクセルのファイルサイズが急...
-
ワークシートそのものの色を変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルでブック内の倍率がバ...
-
ハイパーリンクでジャンプした...
-
特定のシートのみ再計算させな...
-
エクセルで複数のシートに画像...
-
【ExcelVBA】マクロの入ったシ...
-
EXCELの図形(テキストボックス)...
-
エクセルのシー名を二段表示に...
-
ワークシートそのものの色を変...
-
エクセル、特定のシートにパス...
-
確定申告用の医療費集計フォー...
-
EXCELの「シートの見出し」のフ...
-
Wordで差し込み印刷時に表示す...
-
Accessのテーブルを既存のExcel...
-
EXCELで存在しないシート...
-
エクセルの2つのシートを並び...
-
エクセルのシート連番の振り直し
-
Excelでマクロ設定したが反映さ...
-
エクセルで、シートの名前を変...
-
エクセルの複数シートでのリン...
おすすめ情報