Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


672 / 13645 ツリー ←次へ | 前へ→

【79081】CSVで重複しないデータを抜き出したい のんびり 17/5/3(水) 19:31 質問[未読]
【79082】Re:CSVで重複しないデータを抜き出したい のんびり 17/5/3(水) 19:36 質問[未読]
【79083】Re:CSVで重複しないデータを抜き出したい マナ 17/5/3(水) 19:54 発言[未読]
【79085】Re:CSVで重複しないデータを抜き出したい のんびり 17/5/3(水) 20:01 質問[未読]
【79089】Re:CSVで重複しないデータを抜き出したい マナ 17/5/3(水) 21:50 発言[未読]
【79091】Re:CSVで重複しないデータを抜き出したい マナ 17/5/4(木) 9:51 発言[未読]
【79092】Re:CSVで重複しないデータを抜き出したい マナ 17/5/4(木) 17:03 発言[未読]
【79084】Re:CSVで重複しないデータを抜き出したい マナ 17/5/3(水) 20:00 発言[未読]
【79086】Re:CSVで重複しないデータを抜き出したい のんびり 17/5/3(水) 20:10 質問[未読]
【79087】Re:CSVで重複しないデータを抜き出したい マナ 17/5/3(水) 20:33 発言[未読]
【79088】Re:CSVで重複しないデータを抜き出したい マナ 17/5/3(水) 21:23 発言[未読]

【79081】CSVで重複しないデータを抜き出したい
質問  のんびり  - 17/5/3(水) 19:31 -

引用なし
パスワード
   VBA初心者です。

4つのワークシート中、2つに
「日付」や「店」「金額」などといったデータが入っています。
この中から「金額」が重複していないデータを抽出したいと思っています。

具体的に説明すると
1.クレカデータ(金額がE列の5行以降に入っている)
2.家計簿データ(金額がE列の5行以降に入っている)
3.整合データ(金額をB列の5行以降に入れる)※作成済み
4.不整合データ(金額をB列の5行以降に入れる)←これを作りたい


1.に入っているが2.に入っていない1.のデータを抽出し
4.に入れたい。
抽出するデータも行まるごとではなく
いくつかの列を選んで抽出したいです。

ちなみに、1.と2.の金額が一致するデータを抽出することは成功していて
3.に入っている。それを使用することも可能です。

一致ができたので、不一致も簡単かと思いきや
全然違いますよね…??
色々と調べてみたのですが理解できず、自分のものにカスタマイズできずにいます。

ゴールデンウィークのお休みの所恐縮です。
よろしくお願いいたします。

【79082】Re:CSVで重複しないデータを抜き出し...
質問  のんびり  - 17/5/3(水) 19:36 -

引用なし
パスワード
   補足です。

重複しない、というのは
「金額」のみを比べるということでokです。
説明不足で申し訳ございません。

【79083】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 19:54 -

引用なし
パスワード
   ▼のんびり さん:
偶然、金額が同じデータというものが存在するのでは?

参考までに、できてる3を提示してもらえますか。

【79084】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 20:00 -

引用なし
パスワード
   ▼のんびり さん:

追加で質問です。

>いくつかの列を選んで抽出したいです。

ならば各ファイルの各列の項目名を教えてください

【79085】Re:CSVで重複しないデータを抜き出し...
質問  のんびり  - 17/5/3(水) 20:01 -

引用なし
パスワード
   ▼マナ さん:
>▼のんびり さん:
>偶然、金額が同じデータというものが存在するのでは?

おっしゃる通りです。
とりあえずできるところからと考えて作っていたので
(自分で作る計画の中で)
そこまではカバーしきれないかと思って条件に入れていませんでした。
カバーできるとうれしいですが…

>
>参考までに、できてる3を提示してもらえますか。

不要な部分も入っているかと思います。お見苦しいと思いますが、以下です。


Sub データ照合()
  Const JCB_SYA As Integer = 1   
  Const JCB_BI As Integer = 3     
  Const JCB_SAKI As Integer = 4    
  Const JCB_KINGAKU As Integer = 5  

  Const MM_KINGAKU As Integer = 5  
  
  Const S_KINGAKU As Integer = 2   

  Dim j As Integer   
  Dim m As Integer    
  Dim Cnt As Integer  
  
  Dim JCBKiten As Range 
  Dim MMKiten As Range 
  Dim SeiKiten As Range 

  Cnt = 1        

  Set JCBKiten = Worksheets("JCBデータ").Range("A5")
  Set MMKiten = Worksheets("マスターマネーデータ").Range("A5")
  Set SeiKiten = Worksheets("整合データ").Range("A5")

For m = 1 To MMKiten.CurrentRegion.Rows.Count

 For j = 1 To JCBKiten.CurrentRegion.Rows.Count
    
    If JCBKiten.Cells(j, JCB_KINGAKU).Value = MMKiten.Cells(m, MM_KINGAKU).Value Then

       SeiKiten.Cells(Cnt, 1).Value = _
         JCBKiten.Cells(j, JCB_BI).Value
         
       SeiKiten.Cells(Cnt, 2).Value = _
         JCBKiten.Cells(j, JCB_KINGAKU).Value
         
       SeiKiten.Cells(Cnt, 3).Value = _
         JCBKiten.Cells(j, JCB_SAKI).Value

       SeiKiten.Cells(Cnt, 4).Value = _
         JCBKiten.Cells(j, JCB_SYA).Value


      Cnt = Cnt + 1 
    End If
  Next j
  
Next m
  
    
End Sub

【79086】Re:CSVで重複しないデータを抜き出し...
質問  のんびり  - 17/5/3(水) 20:10 -

引用なし
パスワード
   先ほどのVBAに一部コメントをつけました。


  Const JCB_SYA As Integer = 1     '「JCBデータ」ワークシートの「ご利用者」の列
  Const JCB_BI As Integer = 3     '「JCBデータ」ワークシートの「ご利用日」の列
  Const JCB_SAKI As Integer = 4    '「JCBデータ」ワークシートの「ご利用先など」の列
  Const JCB_KINGAKU As Integer = 5   '「JCBデータ」ワークシートの「ご利用金額(¥)」の列

紛らわしいのですが、「整合データ」と同じく「不整合データ」でも
3、5、4、1の順に列を作りたいと思っています。
どうお伝えするのが一番お手間じゃないのかわからず、こんな伝え方でごめんなさい。

【79087】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 20:33 -

引用なし
パスワード
   ▼のんびり さん:

JCBデータとマスターマネーデータは同じ構成ですか

【79088】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 21:23 -

引用なし
パスワード
   ▼のんびり さん:

A列C列D列E列が同じものがMMシートにあれば、整合データ
A列C列D列E列が同じものがMMシートになければ、不整合データ

という考えでよいですか。

だとすると、作業列を使って

MMシートのF列にこんな式を入れます。
=A2&"@"&C2&"@"&D2&"@"&E2

で、JCBシートのF列は
=COUNTIF(MMシート!F:F,A2&"@"&C2&"@"&D2&"@"&E2)

これで、1の場合が整合データ、0が不整合データになりませんか。
あとは、オートフィルタで抽出しコピペ
もしくは、フィルタオプションで直接抽出結果を転記

ということを、マクロにするとできそうです。
まずは手作業で、試してみるとよいです。


整合データだけならもっと簡単に作業列使わなくても
フィルタオプションだけで転記できそうですが、
不整合データが思いつきませんでした。

【79089】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 21:50 -

引用なし
パスワード
   ▼のんびり さん:

>不要な部分も入っているかと思います

現在のコードで気になることが、もう1点。

もし、一致していたら、内側のループからExit forしないと、
無駄に確認を続行することになります。

【79091】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/4(木) 9:51 -

引用なし
パスワード
   ▼のんびり さん:

現在のコードをベースに考えてみました。
判定用の変数を1個使います。

--------
あずは、現在のコード

for m=1 to …MMシートをループ
  for j=1 to …JCBシートをループ
    If 同じデータなら then
      転記
    end if
  next j
next m


--------
これを、こんな感じで
内側のループが終わってから転記するようにします。

Dim 整合 as boolean

for m=1 to …MMシートをループ
  整合=False
  for j=1 to …JCBシートをループ
    If 同じデータなら then
      整合=True
      Exit For
    end if
    If 整合=True then
      転記
    end if
  next j
next m

--------

で、整合=Falseなら転記するようにすれば
不整合のデータのみ転記になるかも。

【79092】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/4(木) 17:03 -

引用なし
パスワード
   ▼のんびり さん:

とんでもないミスがありました。

>内側のループが終わってから転記するようにします

といっておきながら、そうなっていませんでした。
あと、JCBシートのループが外側でしたね。

このような感じにすると、
整合・不整合を振り分けることもできます。

Dim 整合 as boolean

for j=1 to …JCBシートをループ
  整合=False
  for m=1 to …MMシートをループ
    If MMシートと同じデータなら then
      整合=True
      Exit For
    end if
  next m
  If 整合=True then
    整合シートに転記
  else
    不整合シートに転記
  end if
next j

672 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free