🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

547閲覧

VBA 重複データ処理についてアドバイスを

memem12

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/01/19 07:42

前提・実現したいこと

現在、符号と個数、番号を入力して同じ符号を伴った番号を入力したとき、
符号と個数は統合されるも番号は追加される、下図のようなリストを作成しています。
C列で番号を入力したときにTarget.Offsetによって、A列で同じ符号を探すようにしたいのですが、
Targetで選んだセルの値を、同じ符号のある列のセルに渡すにはどうすればいいでしょうか。
またその際、符号をDictionaryオブジェクトで探せばよいのか、それとも別のオブジェクトを使うべきなのか分かりません。
そもそも考え方が分からないので、アドバイスだけでもお願いします。

イメージ説明

該当のソースコード

完成していないのですが、一応の参考として載せています。

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2Application.EnableEvents = False 3 4 Dim SearchRange As Range 5 Dim ResultRange As Range 6 Dim KeyItem As String 7 Set SearchRange = Range("A1:A1000") 8 9 10With Target 11If .Column = 3 And .Row >= 2 And .Value <> "" Then 12 If .Value <> "" Then 13 .Value = "(" & .Offset(0, -1).Value & ")" & .Value 14 15 KeyItem = .Offset(0,-2).Value '符号をキーにして探す 16  Set ResultRange = SearchRange.Find(KeyItem, LookAt:=xlPart) 17 18 If Not ResultRange Is Nothing Then '同じ符号がある場合、ここで処理を行いたい 19 .Value = ' 20 21 22 Exit Sub 23 End If 24 End If 25End If 26End With 27 28Application.EnableEvents = True 29End Sub 30

補足情報(FW/ツールのバージョンなど)

使用しているExcel.2013

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

入力ミスしたら大変ですよね。
今の表はあくまで入力専用として使い、
別表で一覧にした方が良いでしょう。

投稿2021/01/19 08:12

radames1000

総合スコア1925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

memem12

2021/01/20 04:40

回答ありがとうございました。 自分も入力用を検討していましたが、すでに別の入力シートを作っていたので このシートで完成させたかったのです。説明不足で申し訳ありません。
radames1000

2021/01/20 04:41

入力を二度されているということでしょうか? すでに入力シートがあるなら、そこからデータを引っ張った方が 良いと思うのですが。
memem12

2021/01/20 06:10

本来の符号はもっと種類が多いので、それを整理するためのシートのようなものです。 入力に手間がかかるので使いやすいこちらのほうを採用したいと考えた次第です。
guest

0

ベストアンサー

あまり難しいことは考えず、素直にForループ回すところから組めばいいと思いました。

↓こちらは、おそらく質問者様が想定されている動き

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 3 Dim SearchRange As Range 4 Dim ResultRange As Range 5 Dim KeyItem As String 6 Dim ResultNumber As String 7 Dim ResultValue As Long 8 Dim Rng As Variant 9 Set SearchRange = Range("A1:A1000") 10 Set ResultRange = Range("F1:F1000") 11 12With Target 13If Target.Count > 1 Then Exit Sub 14If .Column = 3 And .Row >= 2 And .Value <> "" Then 15 16 Application.EnableEvents = False 17 18 If .Value <> "" Then 19 .Value = "(" & .Offset(0, -1).Value & ")" & .Value 20 21 KeyItem = .Offset(0, -2).Value '符号をキーにして探す 22 23 For Each Rng In SearchRange 24 25 If Rng = KeyItem And Rng.Row <> Target.Row Then 26 27 ResultNumber = Rng.Offset(0, 2) & Target.Value 28 ResultValue = Rng.Offset(0, 1) + Target.Offset(0, -1).Value 29 Rng.Offset(0, 1) = ResultValue 30 Rng.Offset(0, 2) = ResultNumber 31 32 Target.Offset(0, -2).Resize(1, 3).ClearContents 33 34 Exit For 35 End If 36 Next 37 38 End If 39End If 40End With 41 42Application.EnableEvents = True 43End Sub

ただradames1000様が言われる通り、元データは元データで残して別の表として生成していく方が確実かと思います。
↓はそのような動きを想定しています。

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 3 Dim SearchRange As Range 4 Dim ResultRange As Range 5 Dim KeyItem As String 6 Dim ResultNumber As String 7 Dim ResultValue As Long 8 Dim Rng As Variant 9 Set SearchRange = Range("A1:A1000") 10 Set ResultRange = Range("F1:F1000") 11 12With Target 13If Target.Count > 1 Then Exit Sub 14If .Column = 3 And .Row >= 2 And .Value <> "" Then 15 16 Application.EnableEvents = False 17 18 If .Value <> "" Then 19 .Value = "(" & .Offset(0, -1).Value & ")" & .Value 20 21 KeyItem = .Offset(0, -2).Value '符号をキーにして探す 22 23 For Each Rng In SearchRange 24 25 If Rng = KeyItem Then 26 27 ResultNumber = ResultNumber & Rng.Offset(0, 2).Value 28 ResultValue = ResultValue + Rng.Offset(0, 1).Value 29 30 End If 31 32 If Rng = "" Then Exit For 33 34 Next 35 36 For Each Rng In ResultRange 37 38 If Rng = KeyItem Or Rng = "" Then 39 Rng.Value = KeyItem 40 Rng.Offset(0, 1) = ResultValue 41 Rng.Offset(0, 2) = ResultNumber 42 43 Exit For 44 End If 45 46 Next 47 48 End If 49End If 50End With 51 52Application.EnableEvents = True 53End Sub

投稿2021/01/20 04:01

Usirow

総合スコア364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

memem12

2021/01/20 04:33

回答ありがとうございました。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問