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
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
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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
エクセルのマクロ機能で前のシートに返るVBAはどうかくか
Excel(エクセル)
-
excelで直前に参照していたブックに戻るマクロは作れますか?
Excel(エクセル)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
VBAでユーザーフォームの表示を確認
Visual Basic(VBA)
-
6
VBA 連続行データを5行ずつ隣の列に貼り付ける
Excel(エクセル)
-
7
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
8
最も近い数値のあるセルを探す
Excel(エクセル)
-
9
エクセルVBAでTargetのセルに設定された「名前の定義」の取得方法は?
Excel(エクセル)
-
10
配列で格納したものをmsgboxで表示する方法について
Access(アクセス)
-
11
スペースとスペースの間の文字を抽出する関数
Excel(エクセル)
-
12
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
13
ExcelでVBAを使用した際に、『パス名が無効です』とエラーになります。
Excel(エクセル)
-
14
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
15
【VBA】計算結果に小数点第2位までを表示させる方法
Visual Basic(VBA)
-
16
ExcelのVBAでエラー13が出てしまいます。(泣き)
Excel(エクセル)
-
17
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルで複数のシートに画像...
-
エクセルでブック内の倍率がバ...
-
特定のシートのみ再計算させな...
-
【ExcelVBA】マクロの入ったシ...
-
【Excel VBA】データ貼り付け先...
-
Excel 全シート上のボタンを削...
-
ワークシートそのものの色を変...
-
エクセルのシート連番の振り直し
-
エクセル2003で、複数のシート...
-
EXCELの図形(テキストボックス)...
-
ハイパーリンクでジャンプした...
-
Wordで差し込み印刷時に表示す...
-
エクセルのシー名を二段表示に...
-
エクセルで「シートを追加」→「...
-
エクセル、特定のシートにパス...
-
エクセル 非表示のシートをハ...
-
Accessのテーブルを既存のExcel...
-
accessへエクセルの複数のシー...
-
エクセルでリンク貼り付けした...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルで複数のシートに画像...
-
エクセルでブック内の倍率がバ...
-
特定のシートのみ再計算させな...
-
【ExcelVBA】マクロの入ったシ...
-
ワークシートそのものの色を変...
-
エクセルの2つのシートを並び...
-
EXCELの図形(テキストボックス)...
-
ハイパーリンクでジャンプした...
-
Wordで差し込み印刷時に表示す...
-
エクセルで、シートの名前を変...
-
エクセル、特定のシートにパス...
-
エクセルのシー名を二段表示に...
-
Accessのテーブルを既存のExcel...
-
確定申告用の医療費集計フォー...
-
エクセルのシート連番の振り直し
-
【Excel】エクセルの1ファイル...
-
エクセルの複数シートでのリン...
-
【Excel VBA】データ貼り付け先...
-
エクセルでリンク貼り付けした...
おすすめ情報