■■ □投稿者/ 半平太 -(2024/04/26(08:23)) □U R L/ 微妙にコードが違うような気がします。 以下のコードで全体を上書きして、トライしてみてください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim strAry(0 To 1) Dim Pos strAry(0) = Split("T7,X7,AB7,AF7,AJ7,AN7,AR7,AV7,AB9,AF9,AJ9,AN9,AR9,AV9,AJ11,AN11,AR11,AV11,AR13,AV13", ",") strAry(1) = Split("T24,X24,AZ24,BD24,AZ30,BD30,T28,X28,T30,X30,AZ26,BD26,AZ32,BD32,T26,X26,AZ28,BD28,T32,X32", ",") Pos = Application.Match(Target.Address(0, 0), strAry(0), 0) If IsNumeric(Pos) Then Pos = Pos * 10 + 1 '1桁目は1。strAry(1)が転記先 Else Pos = Application.Match(Target.Address(0, 0), strAry(1), 0) If IsError(Pos) Then Exit Sub Else Pos = Pos * 10 '1桁目は0。strAry(0)が転記先 End If End If Application.EnableEvents = False Range(strAry(Pos Mod 10)(Pos \ 10 - 1)) = Target.Value Application.EnableEvents = True End Sub 上のコードで正常動作することを確認してください。 その後、そちら独自の変更(もしあれば)を施すと旨く行かなくなるなら、 どう変更したのか教えてください。 |
■■ □投稿者/ 匿名 -(2024/04/26(08:40)) □U R L/ >Exit Subにとび、メッセージ表示されません。 コードの先頭に MsgBox Target.Address(0, 0) としてみたら原因が判明するかも。 |
■■ □投稿者/ むみ -(2024/04/26(09:25)) □U R L/ 半平太さま 196179のソースに書き換えました 数値の時は対のセルに値が変更されますが(OK) 空白にした場合は Pos = Application.Match(Target.Address(0, 0), strAry(0), 0) で、エラー2042となり Exit Sub となり、そのセルだけ空白で対のセルには数値が残ったままになります。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
■■ □投稿者/ 半平太 -(2024/04/26(09:54)) □U R L/ > If IsError(Pos) Then MsgBox Target.Address(0, 0) 'ここに一文挿入して,"T7"と出るか確認してください。 > Exit Sub |
■■ □投稿者/ むみ -(2024/04/26(11:20)) □U R L/ 2セル結合してますので、 T7:U8 と表示されました!! |
■■ □投稿者/ 半平太 -(2024/04/26(12:05)) □U R L/ なるほどです。 私も知らなかったです。ありがとうございます。 ※結合セルだと、値入力では単セル、クリア操作では複数セルが返っていますね。 なら、冒頭で強制的にワンセルにする案↓ > Dim Pos Set Target = Target.Cells(1, 1) ’ここで左上の1セルに限定する |
■■ □投稿者/ むみ -(2024/04/26(13:17)) □U R L/ おぉ!!!!素晴らしい!!! 出来ました!!!!クリアになりました。 こんなに丁寧にお世話になってなんですが、、 この一文の意味が理解できません Range(strAry(Pos Mod 10)(Pos \ 10 - 1)) = Target.Value 配列を10で割る?¥マークで 10-1・・ もし、よろしければ引き続きご教授願えれば・・図々しくすみません |
■■ □投稿者/ 半平太 -(2024/04/26(14:29)) □U R L/ >Range(strAry(Pos Mod 10)(Pos \ 10 - 1)) = Target.Value >この一文の意味が理解できません 確かに分かりにくいですよねー。 意図するところは簡単で、 (1)変更したセルは strAry(0)内のアドレスなのか strAry(1)内なのか。 (2)配列の何番目に在ったのか。 それが分かれば、自動変更が可能である、と言う事になります。 さて Pos = Application.Match(Target.Address(0, 0), strAry(0), 0) Pos = Application.Match(Target.Address(0, 0), strAry(1), 0) 上記2つのステートメントにより、何番目かが判明し、 どっちの配列に在ったのかは strAry(0)か strAry(1)の違いで分かる。 そこで strAry(0)内に在った場合、Posを10倍して、1を足す Pos = Pos * 10 + 1 '1桁目は1。strAry(1)が転記先 strAry(1)内に在った場合は、Posを10倍して、何も足さない。 Pos = Pos * 10 '1桁目は0。strAry(0)が転記先 そんな加工をPosに施しておくと (Pos Mod 10) → Posを10で割った余りが、自動変更すべき相手方の配列番号を示し、 (Pos \ 10 - 1) → Posを10で割った商が、配列内の添え字になる (ただし、配列の添え字は0スタートなので、1を差し引く) 以上で必要な数値が揃ったので 自動変更すべきセルを特定して、Targetの値を代入する。 Range(strAry(相手方の配列番号)(配列内添え字)) = Target.Value 例えば、T7に変更があれば Range(strAry(1) (1-1)) = Target.Value |
■1■ □投稿者/ むみ -(2024/04/26(15:11)) □U R L/ 半平太さま 大変詳しくわかりやすく 本当にありがとうございました!! ド素人にここまで丁寧にお付き合い頂き感謝しかありません。 また疑問が沸くかもですが、、、(^0^;) ありがとうございました!! |