Excel VBA質問箱 IV

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

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


5213 / 13644 ツリー ←次へ | 前へ→

【52026】決まった範囲内で重複があるか調べたい みかこ 07/10/16(火) 20:48 質問[未読]
【52028】Re:決まった範囲内で重複があるか調べたい ponpon 07/10/16(火) 22:00 発言[未読]
【52047】Re:決まった範囲内で重複があるか調べたい みかこ 07/10/17(水) 20:46 発言[未読]
【52050】Re:決まった範囲内で重複があるか調べたい ponpon 07/10/17(水) 22:14 発言[未読]
【52073】Re:決まった範囲内で重複があるか調べたい みかこ 07/10/18(木) 20:58 お礼[未読]

【52026】決まった範囲内で重複があるか調べたい
質問  みかこ  - 07/10/16(火) 20:48 -

引用なし
パスワード
   こんばんは。

100個ほどのエクセルファイルがあります。
このファイル形式は共通しています。

各ファイルの売上というシートのA2:M2の範囲に
4月、5月・・・と月が書かれています。
この中に重複する月がないかを調べ、
重複してなければ、店舗データというエクセルファイルに情報を
転記したいと思っております。
店舗データファイルの中には一覧というシートがあり
A1:AU1に月が書かれています。

この流れのなかで
重複しているか?を判定する構文がかけません。
findを使って書いてみたのですが
どうすすめてよいのかがわからず投稿させていただきました。
中途半端はコードになっているのですが、
どうぞ宜しくお願い致します。

for i =2 to 13
  set status=thebk.worksheets("売上").range("A2:M2"). _
        specialcells(type:=xlcelltypeconstants). _
        find(what:=cells(2,i).value,after(2,1), _
        lookat:=xlwhole)
  
  if not status is nothing then
    set ws=thisworkbook.worksheets("一覧")

    arow=ws.range("A65536").end(xlup).row+1
    for each c in thebk.worksheets("売上").range("A2:M2")
      ck=application.match(clng(c.value),ws.range("A1:AU1"),0)
      if not iserror(ck) then
        with ws
          .cells(arow,1).value=c.offset(1)
          .cells(arow,2).value=c.offset(2)
        end with
      end if
    next
  end if
  
next i

※thebkは100のファイルをループさせているので、
そのファイル名を指しています。

【52028】Re:決まった範囲内で重複があるか調べたい
発言  ponpon  - 07/10/16(火) 22:00 -

引用なし
パスワード
   >各ファイルの売上というシートのA2:M2の範囲に
>4月、5月・・・と月が書かれています。
>この中に重複する月がないかを調べ、

ここだけ
A2:M2の範囲だと4月から4月までになり、4月が重複しませんか?

Sub test()
  Dim i As Long
 
  With Sheets("売上")
   For i = 1 To 13
   If Application.CountIf(.Range("A2:M2"), .Cells(2, i).Value) > 1 Then
     MsgBox "重複があります"
     Exit For
   End If
   Next
  End With
End Sub

【52047】Re:決まった範囲内で重複があるか調べたい
発言  みかこ  - 07/10/17(水) 20:46 -

引用なし
パスワード
   ▼ponpon さん:
お返事ありがとうございます。

>>各ファイルの売上というシートのA2:M2の範囲に
>>4月、5月・・・と月が書かれています。
>>この中に重複する月がないかを調べ、
>↑
>ここだけ
>A2:M2の範囲だと4月から4月までになり、4月が重複しませんか?
>
申し訳ありません。間違えてしまいました。
range("B2:M2")です。


>Sub test()
>  Dim i As Long
> 
>  With Sheets("売上")
>   For i = 2 To 14
>   If Application.CountIf(.Range("B2:M2"), .Cells(2, i).Value) > 1 Then
>     MsgBox "重複があります"
>     Exit For
>   End If
>   Next
>  End With
>End Sub
↑間違ってしまったところは変えて返信しています。


ご教授いただきましたコードでは
B2:M2の中で重複があれば転記してしまうので
If Application.CountIf(.Range("B2:M2"), .Cells(2, i).Value) > 1 Then
の部分を
If Application.CountIf(.Range("B2:M2"), .Cells(2, i).Value) = 1 Then
と書き換えてみました。

結果、重複検索関係なく全部のファイルが転記されてしまい
かつ
転記作業がひとつのファイルに対して何回も行われてしまいました。

↓こんな感じです。
番号  値段
NO.123 200
NO.123 200
NO.123 200
NO.123 200
NO.123 200
NO.123 200
NO.123 200
NO.123 200




教えていただいたのに、
なんとかうまく動かないものかと奮闘いたしておりますが
再度、ご教授いただけますでしょうか。
宜しくお願い致します。

【52050】Re:決まった範囲内で重複があるか調べたい
発言  ponpon  - 07/10/17(水) 22:14 -

引用なし
パスワード
   ▼みかこ さん:
>If Application.CountIf(.Range("B2:M2"), .Cells(2, i).Value) = 1 Then
>と書き換えてみました。

よくわかってませんが、
上記の方法で判定して、転記のコードを
For i = 2 To 14
next
で、挟んでいませんか?そうだと、4月が1だから転記、5月は1だから転記
6月は重複しているので転記なし、7月は1なので転記・・・と何回も転記されるのでは?

そこで、Flgで重複かどうかを判定し、重複がなければ転記というようにしてみたらどうでしょう?

Option Explicit

Sub test3()
  Dim i As Long
  Dim Flg As Boolean

 
  Flg = True
  With Sheets("売上")
   For i = 2 To 13
   If Application.CountIf(.Range("B2:M2"), .Cells(2, i).Value) > 1 Then
     Flg = False
     Exit For
   End If
   Next
  End With
 
  If Flg Then
   ’転記処理
  End If


>教えていただいたのに、
>なんとかうまく動かないものかと奮闘いたしておりますが
>再度、ご教授いただけますでしょうか。
>宜しくお願い致します。

【52073】Re:決まった範囲内で重複があるか調べたい
お礼  みかこ  - 07/10/18(木) 20:58 -

引用なし
パスワード
   ▼ponpon さん:

for i〜Nextの間からどうすればよいのかわからなかったのですが
新しい方法を知ることができてよかったです。

ご親切にありがとうございました。

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