Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
アクティブシートのA1セルの価を別シートのセルに
投稿日時: 20/05/20 12:14:28
投稿者: 園 日暮

お世話になります。
  
1 例
  アクティブシート(シート名 A) A1セル(123456) が
 
  シート名(H) G4セル(123456)
2 例
   アクティブシート(シート名 B) A1セル(789123) が
 
  シート名(H) G4セル(789123)
 
  条件
  1 データー元のシート A B C と7シートあります、
    アクティブシートはその都度変わります。  
    2 セルの位置のA1は変わらないが値はchangeします。
    値が変更されたらその都度、シートH G4に反映したい。
  3 取得側のシートH及びセルG4は変わりません。
 
 とできる方法がないでしょうか。
  
 もしあればご指導いただきたいです。

回答
投稿日時: 20/05/20 13:12:17
投稿者: WinArrow
投稿者のウェブサイトに移動

 
どのブックにマクロを持たせるのか?
わかりませんので、自ブックという前提で・・・
  
Thisworkbookモジュールの中の
Workbook_SheetActivate
イベントプロシジャを使って
引数のシートオブジェクトを使えば処理可能です。
   
コードはそれほど難しくないので、自分で考えましょう。
 
 

回答
投稿日時: 20/05/20 15:06:39
投稿者: simple

横から失礼します。
 
値が変更された都度ということであれば、ThisWorkbookモジュールの
Workbook_SheetChangeイベントプロシージャでしょうか。
 
余計なコメントかも知れませんが、以下、留意点を。
 
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
End Sub
のなかに必要な処理を書きます。
 
Target引数がその変動が起きたセル、Shはそのシートオブジェクト(これは多分使わなくてよい?)です。
TargetのアドレスがA1以外であればすぐにExit Subし、A1のときだけ所要の動作を行います。
 
また、シート名(H) G4セルを書き換えたときに、そのイベントプロシージャが動作しないように
一時的に
    Application.EnableEvents = False
でイベントが起きないように仕組んでから書き込みを行い、直後に
    Application.EnableEvents = True
で元に戻すとよいでしょう。
 
イベントプロシージャに関するコード例を参照しながら作るとよいでしょう。
書籍、またはネット上の記事が参考になるはずです。

投稿日時: 20/05/20 17:00:17
投稿者: 園 日暮

アドバイスでサイトでいろいろ調べましたが良く分からず参っています。
具体的にご指導いただけませんでしょうか。

回答
投稿日時: 20/05/20 17:14:17
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
  
条件
   1 データー元のシート A B C と7シートあります、
     アクティブシートはその都度変わります。  
    2 セルの位置のA1は変わらないが値はchangeします。
     値が変更されたらその都度、シートH G4に反映したい。
   3 取得側のシートH及びセルG4は変わりません。

↓確認です。
条件1の7シートは、
A,B,C,D,E,F,Gの7シートですね?
このシートのセルA1が変わったときに
シートHのG4に「値」を転記する…という仕様ですね?
 
ところで、アクティブシートに関して、
例えば、シートAがアクティブでなくても、
シートAのセルA1は、更新される場合があります。
これは、転記対象にするのですか?
 
 
 
 

回答
投稿日時: 20/05/20 17:20:10
投稿者: WinArrow
投稿者のウェブサイトに移動

それから
もう1件
 
Workbook_SheetChangeイベントプロシージャ
は、せるA1の値が変わったときと考えてしまいますが、
同じ「値」でも、イベントは発生します。
この制御は、ちょっと難しいかもしれません。

投稿日時: 20/05/20 17:53:22
投稿者: 園 日暮

ありがとうございます。
 
アクティブシートでない場合の G 4セル の値は変わることはありません。

投稿日時: 20/05/20 17:57:56
投稿者: 園 日暮

園 日暮 さんの引用:
ありがとうございます。
 
アクティブシートでない場合の G 4セル の値は変わることはありません。

 
 
間違いで、
G4 でなく A1 です

回答
投稿日時: 20/05/20 17:58:51
投稿者: simple

参考にしてください。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Address(False, False) <> "A1" Then Exit Sub
    Application.EnableEvents = False
    Worksheets("H").Range("G4").Value = Target.Value
    Application.EnableEvents = True
End Sub

細かい話ですが、A1:A3を同時に変更した場合など、A1が変わったとしても転記はされません。
この場合も変更したいのであれば、TargetのかわりにTarget(1)とします。(引数以外の二カ所とも)
 
ちなみに、そのセルがアクティブシートにあるかどうかは考慮していません。
そういう必要があるんですか?

投稿日時: 20/05/20 18:04:53
投稿者: 園 日暮

WinArrow さんの引用:
それから
もう1件
 
Workbook_SheetChangeイベントプロシージャ
は、せるA1の値が変わったときと考えてしまいますが、
同じ「値」でも、イベントは発生します。
この制御は、ちょっと難しいかもしれません。

 
セルA1の価は同じ値はありません
 
シートA A1 シートB A1 も等しくありません
他のシート間も同様です

投稿日時: 20/05/20 18:12:08
投稿者: 園 日暮

simple さんの引用:
参考にしてください。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Address(False, False) <> "A1" Then Exit Sub
    Application.EnableEvents = False
    Worksheets("H").Range("G4").Value = Target.Value
    Application.EnableEvents = True
End Sub

細かい話ですが、A1:A3を同時に変更した場合など、A1が変わったとしても転記はされません。
この場合も変更したいのであれば、TargetのかわりにTarget(1)とします。(引数以外の二カ所とも)
 
ちなみに、そのセルがアクティブシートにあるかどうかは考慮していません。
そういう必要があるんですか?

 
A1の価は =A2&B15 なのでご質問に関係しますか

回答
投稿日時: 20/05/20 18:12:40
投稿者: WinArrow
投稿者のウェブサイトに移動

園 日暮 さんの引用:
WinArrow さんの引用:
それから
もう1件
 
Workbook_SheetChangeイベントプロシージャ
は、せるA1の値が変わったときと考えてしまいますが、
同じ「値」でも、イベントは発生します。
この制御は、ちょっと難しいかもしれません。

 
セルA1の価は同じ値はありません
 
シートA A1 シートB A1 も等しくありません
他のシート間も同様です

何か、勘違いしているような気がします。
 
シートAのセルA1を選択して、
更新モードにした後、[Enter]を押すと、
Workbook_SheetChangeイベントプロシージャが発生するということです。

回答
投稿日時: 20/05/20 18:35:46
投稿者: WinArrow
投稿者のウェブサイトに移動

>A1の価は =A2&B15 なのでご質問に関係しますか
  
大いに関係あります。
  
セルA2が変わっても、セルB15が変わっても
 セルA1の「値」は、見た目では変わりますが、
  
A2、または、B15が川たことによる
Workbook_SheetChangeイベントは発生しますが、
セルA1では発生しません。
つまり、引数:TargetがA1になることはないということです。
 
他のシートのセルを参照している数式はありませんか?
 
 
 

投稿日時: 20/05/20 18:37:18
投稿者: 園 日暮

WinArrow さんの引用:
園 日暮 さんの引用:
WinArrow さんの引用:
それから
もう1件
 
Workbook_SheetChangeイベントプロシージャ
は、せるA1の値が変わったときと考えてしまいますが、
同じ「値」でも、イベントは発生します。
この制御は、ちょっと難しいかもしれません。

 
セルA1の価は同じ値はありません
 
シートA A1 シートB A1 も等しくありません
他のシート間も同様です

何か、勘違いしているような気がします。
 
シートAのセルA1を選択して、
更新モードにした後、[Enter]を押すと、
Workbook_SheetChangeイベントプロシージャが発生するということです。

 
A1 の値は   A1 =if(c15="","",A2&c15) です
A2 はクリックしますが A1 は自動ですからクリックなどしません
因みに c15 も自動的にです

回答
投稿日時: 20/05/20 18:54:57
投稿者: WinArrow
投稿者のウェブサイトに移動

simpleさんの提示したコードに
> If Target.Address(False, False) <> "A1" Then Exit Sub
このコードは
TargetがA1セル以外は、転記処理をスキップする命令です。
先ほども書きましたが、
セルA1に数式が入っている場合は、
このイベントは発生しないから、
simpleさんの提示したコードでは対応しない
ということです。
 

回答
投稿日時: 20/05/20 19:15:28
投稿者: WinArrow
投稿者のウェブサイトに移動

もし、
Workbook_SheetChangeイベントプロシージャで対応しようと考えるならば
セルA1の値が変わる要件となる参照セルを全部チェックする必要があります。
但し、別シートのセルを参照している場合は、無理。
 
最後の説明に関係しますが、
A2とC15を参照していますが、
C15が別セルを参照していたら、そのセルもチェックの対象にします。
 
 
 

投稿日時: 20/05/20 19:32:14
投稿者: 園 日暮

WinArrow さんの引用:
もし、
Workbook_SheetChangeイベントプロシージャで対応しようと考えるならば
セルA1の値が変わる要件となる参照セルを全部チェックする必要があります。
但し、別シートのセルを参照している場合は、無理。
 
最後の説明に関係しますが、
A2とC15を参照していますが、
C15が別セルを参照していたら、そのセルもチェックの対象にします。

C15 = H4 です

投稿日時: 20/05/20 19:47:48
投稿者: 園 日暮

WinArrow さんの引用:
>A1の価は =A2&B15 なのでご質問に関係しますか
  
大いに関係あります。
  
セルA2が変わっても、セルB15が変わっても
 セルA1の「値」は、見た目では変わりますが、
  
A2、または、B15が川たことによる
Workbook_SheetChangeイベントは発生しますが、
セルA1では発生しません。
つまり、引数:TargetがA1になることはないということです。
 
他のシートのセルを参照している数式はありませんか?
 
 
 

  B4  =IF(A2="","",VLOOKUP(A2,顧客管理!A2:D211,3,FALSE))

回答
投稿日時: 20/05/20 21:13:01
投稿者: WinArrow
投稿者のウェブサイトに移動

>B4  =IF(A2="","",VLOOKUP(A2,顧客管理!A2:D211,3,FALSE))
このセル(B4)h、A1とどの様な関係にあるのでしょう。
A1とは関係がないのでしたら、ここで回答いただいても、・・・
 
A1の「値」が変わる要因となっている数式セルを除くセルを
列挙して、
(但し、その中に別のシートを参照しているセルがあれば、対応不可)・
・・・Changeイベントでチェックするという
コードを記述しましょう。
 
アドバイスはここまでとします。
 
 
 
 

回答
投稿日時: 20/05/21 11:22:09
投稿者: WinArrow
投稿者のウェブサイトに移動

リアルタイムでなくてもよいならば、
当該ブックを閉じる直前に
その時点でアクテイブなシートのA1をシートH、G4に書き込めばよい。
 
シートHをアクテイブにした状態で閉じると、直前のアクティブシートがわからないので
シートHは、非表示にしておく方がよいでしょう。
 
現仕様では、
シートH.G4セルの値が
どのシートの値を反映したものか?不明です。
こんなあいまいなものがどんな意味を持つのか?
疑問です。・・・・あえて答えていただく必要はありません。

投稿日時: 20/05/21 15:13:34
投稿者: 園 日暮

WinArrow さんの引用:
リアルタイムでなくてもよいならば、
当該ブックを閉じる直前に
その時点でアクテイブなシートのA1をシートH、G4に書き込めばよい。
 
シートHをアクテイブにした状態で閉じると、直前のアクティブシートがわからないので
シートHは、非表示にしておく方がよいでしょう。
 
現仕様では、
シートH.G4セルの値が
どのシートの値を反映したものか?不明です。
こんなあいまいなものがどんな意味を持つのか?
疑問です。・・・・あえて答えていただく必要はありません。

小生の薄知恵でこんな勝ちで凌ぐことにしました。

Sub 請求2toABcellCopy()
    Sheets("日別請求書2").Select
    Range("A7").Select
    Selection.copy
    Sheets("AB").Select
    Range("A4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("日別請求書2").Select
    Range("j1").Select
End Sub
 
Sub 領toABcellCopy()
    Sheets("領収書").Select
    Range("A9").Select
    Selection.copy
    Sheets("AB").Select
    Range("A4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("領収書").Select
    Range("X1").Select
End Sub
 
ご協力ありがとうございました。