Excel (VBA) |
|
(Windows 11 Pro : Microsoft 365)
〇列と〇列は、片方の列に〇を入力したら、片方に自動で〇が付くようにしたい。
投稿日時: 26/04/17 17:13:48
投稿者: ZU-
|
|---|---|
|
先ほど、一般で投稿しVBAで回答して貰って問合せについては、解決しました。
|
|
|
|
投稿日時: 26/04/17 23:19:59
投稿者: simple
|
|---|---|
|
>最初の質問内容では、作成に問題がありますので、再度よろしくお願いいたします。
|
|
|
|
投稿日時: 26/04/19 15:33:55
投稿者: simple
|
|---|---|
|
> 各セルは〇か空欄か何回でも修正できるように式が消えないようにしたい。
|
|
|
|
投稿日時: 26/04/20 10:43:47
投稿者: ZU-
|
|---|---|
|
|
|
|
|
投稿日時: 26/04/20 11:07:57
投稿者: simple
|
|---|---|
|
> VBAなら各セルの式も消えることなくできるかなと思い投稿してみました。
|
|
|
|
投稿日時: 26/04/20 14:43:27
投稿者: ZU-
|
|---|---|
|
>>VBAなら各セルの式も消えることなくできるかなと思い投稿してみました。
|
|
|
|
投稿日時: 26/04/21 10:41:38
投稿者: 半平太
|
|---|---|
|
>大変失礼いたしました。しかり見直さないで、送信してしまいました。
|
|
|
|
投稿日時: 26/04/21 11:52:50
投稿者: simple
|
|---|---|
|
半平太さんコメントありがとうございました。
Option Explicit
Dim dic As Object
Dim unionR As Range
'ペアとなる列の指定
Sub make_dic()
Dim e, v$
Set dic = CreateObject("Scripting.Dictionary")
dic("A") = "C" '■適宜修正が必要
dic("B") = "E" '■適宜修正が必要
dic("D") = "G" '■適宜修正が必要
For Each e In dic
v = dic(e)
dic(v) = e
Next
Debug.Print Now(); "created Dictionary "
End Sub
'イベント発生の対象となるセル範囲を設定
Function uRange() As Range
Dim s As String, key
For Each key In dic
s = s & key & "3:" & key & "150,"
Next
s = Left(s, Len(s) - 1)
Set uRange = Range(s)
Debug.Print Now(); "対象セル範囲設定済み,"; uRange.Address
End Function
'対象セル範囲の変更を、関連セル範囲に自動反映
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myTarget As Range
Dim t As Range
Dim colname As String
If dic Is Nothing Then
make_dic
Set unionR = uRange()
End If
Set myTarget = Intersect(unionR, Target)
If myTarget Is Nothing Then Exit Sub
For Each t In myTarget
colname = Split(t.Address, "$")(1)
Application.EnableEvents = False
Cells(t.Row, dic(colname)) = t.Value
Application.EnableEvents = True
Next
End Sub
Sub 自動転記処理を再開()
Set dic = Nothing
Set unionR = Nothing
Application.EnableEvents = True
End Sub
■なお、ダブルクリックのイベントプロシージャを使えば、 ・セルが""の状態であれば、"〇"を書き込み、 ・セルに"〇"が入っていれば、"" で上書き と、トグル方式で実行させることも可能でしょう。) これも上記のコードと同じ、シートモジュールにコピーペイストします。 'ダブルクリックで、"〇"と""をトグル設定
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim colname As String
If dic Is Nothing Then
make_dic
Set unionR = uRange()
End If
If Intersect(unionR, Target) Is Nothing Then Exit Sub
colname = Split(Target.Address, "$")(1)
Cancel = True
Select Case Target.Value
Case "": Target.Value = "〇"
Case "〇": Target.Value = ""
End Select
End Sub
【補足】 (1)列の挿入、削除は実行しないで下さい。自動転記の対象列がズレます。 どうしても必要な場合は、 その場合は、次のような手順が間違いがないでしょう。 ・ブックのバックアップを取っておきます。 ・別の新しいシートに、記入済みのものをいったんコピー ・列の挿入、削除を実行。 ・シートモジュールを、再作成したシートのシートモジュールにコピーペイスト ・再度、対象列の指定部分を修正する。 (2)また、ヘルパー関数として、下記のプロシージャが役に立つ時もあるかもしれません。 <<シートモジュール>> Sub 自動転記処理を再開()
Set dic = Nothing
Set unionR = Nothing
Application.EnableEvents = True
End Sub
<<標準モジュール>>に Sub 自動転記処理を中止する()
Application.EnableEvents = False
End Sub
'対象列を変更し、かつ同じシートを使い続ける場合は、これを実行します。
’これを実行しないと変更前のdic,対象セル範囲が継続して使われてしまいます。
Sub 自動転記処理を再開()
Call Sheet1.自動転記処理を再開 'sheet1での処理を再開する
End Sub
=========== 総じて、ある程度マクロの取り扱いに慣れていないと、運用が難しいかもしれません。 前にも記載しましたが、 ・入力列はどちから一方に限定し、 ・関連する別の列ではそれを式で参照させ、その計算セルはロックを掛けて保護する (その列には薄い灰色でも塗りつぶしておけばよいかもしれません。) という方法が安全確実だと思います。 そう言う意味で上記マクロは参考情報です。 |
|
|
|
投稿日時: 26/04/21 13:11:25
投稿者: 半平太
|
|---|---|
|
仕様の確認をした方がいい気がするのですが、
|
|
|
|
投稿日時: 26/04/21 17:37:06
投稿者: simple
|
|---|---|
|
ありがとうございます。コメントはそのとおりかと思います。
|
|
|
|
投稿日時: 26/04/21 19:37:43
投稿者: ZU-
|
|---|---|
|
半平太さま、simpleさま
|
|



