Excel VBA質問箱 IV

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

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


6669 / 13646 ツリー ←次へ | 前へ→

【43790】別シートのデータを条件別に取得 モナ 06/10/25(水) 21:04 質問[未読]
【43794】Re:別シートのデータを条件別に取得 maverick 06/10/25(水) 23:50 回答[未読]
【43799】Re:別シートのデータを条件別に取得 モナ 06/10/26(木) 8:47 質問[未読]
【43823】Re:別シートのデータを条件別に取得 maverick 06/10/26(木) 12:07 発言[未読]
【43828】Re:別シートのデータを条件別に取得 モナ 06/10/26(木) 13:48 質問[未読]
【43841】Re:別シートのデータを条件別に取得 maverick 06/10/26(木) 18:27 発言[未読]
【43844】Re:別シートのデータを条件別に取得 モナ 06/10/26(木) 18:59 発言[未読]
【43874】Re:別シートのデータを条件別に取得 maverick 06/10/27(金) 11:58 発言[未読]
【43895】Re:別シートのデータを条件別に取得 モナ 06/10/28(土) 18:00 発言[未読]

【43790】別シートのデータを条件別に取得
質問  モナ  - 06/10/25(水) 21:04 -

引用なし
パスワード
   こんばんは。VBA初心者です。
次の条件でソースを書きたいのです。
別々に4つマクロは組みましたが、IFとか使って一つにすることが出来ません。
よろしくお願いします。


データ元ファイル:甲(セルA〜J、6万行データ)
コピー先ファイル:乙

条件1.セルAでの判別
 甲BookのセルAにはア、イ、ウの項目があり、フィルタをかけ、
 それぞれの項目ごとにデータを乙Bookへコピーする。
 このとき、フィルタは4行目からかける。
 
 1.−1 :項目ア、イの場合
  項目ア→シート名”ア”、
  項目イ→シート名”イ”のシートにコピーする。
  コピー範囲は、シート全部(フィルタに注意)
  その後、セルAで日付昇順に並べ替えをしたい。

 1.−2 セルAで判別した結果がウの場合
  セルBとセルDを比較して
  1.−2−1 :セルB=セルDならば、
   シート名”イッチ”に、
   セルA,B,C,Dを貼り付け。
   その後、セルAで日付昇順に並べ替えをする。
  1.−2−2 :セルBとセルDが等しくないならば、
   シート名”チガウ”に、
   セルA,D,E,G,Hを貼り付け。
   その後、セルAで日付昇順に並べ替えをする。

以上です。

【43794】Re:別シートのデータを条件別に取得
回答  maverick  - 06/10/25(水) 23:50 -

引用なし
パスワード
   >別々に4つマクロは組みましたが、IFとか使って一つにすることが出来ません。
その条件ならマクロは3つでは?
条件分岐してそれぞれのマクロを呼び出すだけかと・・・

Sub test()
 Dim WSk As Worksheet
 Dim i As Long
 
 Set WSk = Workbooks("甲Book.xls").Sheets(1)

 For i = 1 To WSk.Range("A25536").End(xlUp).Row
  WSk.Activate
  With WSk.Cells(i, "A")
   Select Case .Value
    Case "ア", "イ"
     Call マクロ11 '1.−1
    Case "ウ" '1.−2
     If .Offset(, 1).Value = .Offset(, 2).Value Then
      Call マクロ121  '1.−2−1
     Else
      Call マクロ122 '1.−2−2
     End If
   End Select
  End With
 Next i
End Sub

【43799】Re:別シートのデータを条件別に取得
質問  モナ  - 06/10/26(木) 8:47 -

引用なし
パスワード
   ▼maverick さん:
早速の返信ありがとうございました。
なるほど、こういう風につかえばいいんですね。
とても勉強になりました。

ちなみに他の呼び出すマクロ3つについてですが、
熟練者が記述するとどういう感じになるのでしょうか?
初心者ゆえ、無駄に同じ繰り返しの記述ばかりで
お恥ずかしいコードになっています。
どうか教えてください。

【43823】Re:別シートのデータを条件別に取得
発言  maverick  - 06/10/26(木) 12:07 -

引用なし
パスワード
   マクロ記録したものでも構わないので、現状のコードを提示してみて下さい。
多少なり無駄を無くせるかもしれません。
その方が、モナさんの理解にもつながるでしょうし、こちらの手間も省けます。

【43828】Re:別シートのデータを条件別に取得
質問  モナ  - 06/10/26(木) 13:48 -

引用なし
パスワード
   以下のマクロで動かしています。
素人記述です。
なんとか、無駄を省いたスマートな記述にできればと思います。
【43794】で書いてくださったソースに
うまくきれいにはめてすっきりさせていただけないでしょうか?
それを元に勉強したいと思います。


1.マクロ11

Sub test1()
  Set WS1 = Worksheets("元")
  Set WS2 = Worksheets("OK")
  Set WS3 = Worksheets("OK2")
  Dim Rtn As Integer
  
  
  Workbooks.Open Filename:="甲.xls"
  
  With Worksheets("甲").Range("A1") '★ここのWithを整理したい。
    .Range("A1:B4").Copy Destination:=WS2.Range("A1")
    .Range("A1:B4").Copy Destination:=WS3.Range("A1")
  End With
    
  With Worksheets("joblog").Range("G6")
    .AutoFilter Field:=7, Criteria1:="ftime"
    .CurrentRegion.SpecialCells(xlVisible).Copy WS2.Range("A6")
    
    .AutoFilter Field:=7, Criteria1:="ntime"
    .CurrentRegion.SpecialCells(xlVisible).Copy WS3.Range("A6")
    
    .AutoFilter Field:=7, Criteria1:="<>ftime", Operator:=xlAnd, _
    Criteria2:="<>ntime"
    .CurrentRegion.SpecialCells(xlVisible).Copy WS1.Range("A1")
    
    .AutoFilter
  End With
  Workbooks("甲.xls").Close
  
   ’★ここで、「甲.xlsは変更されています。保存しますか?」のMsgボックスが出てくるが、自動的にNo(保存しない)を選択して閉じたい
  
  WS1.Activate
End Sub


2.マクロ12(1-2-1と1-2-2をくっつけました)
Sub FromTo作成()
  Set WS1 = Worksheets("元")
  Set WS4 = Worksheets("抽出")
  Set WS4 = Worksheets("エラー")

  Dim FT As String
  
  With WS1.Range("A1")
  FT = (WS1.Range("N2").Value = WS1.Range("P2").Value)

  If FT = "False" Then
    .Range("N1:N65536").Copy Destination:=WS2.Range("A1")
    .Range("P1:P65536").Copy Destination:=WS2.Range("B1")
    .Range("D1:D65536").Copy Destination:=WS2.Range("F1")
    .Range("X1:X65536").Copy Destination:=WS2.Range("G1")
    
  Else
    .Range("N1:N65536").Copy Destination:=WS2.Range("A1")
    .Range("O1:O65536").Copy Destination:=WS2.Range("B1")
    .Range("Q1:Q65536").Copy Destination:=WS2.Range("C1")
    .Range("D1:D65536").Copy Destination:=WS2.Range("F1")
    .Range("X1:X65536").Copy Destination:=WS2.Range("G1")
  End If
  End With
  
  WS4.Activate
  
End Sub

【43841】Re:別シートのデータを条件別に取得
発言  maverick  - 06/10/26(木) 18:27 -

引用なし
パスワード
   見ましたが、疑問点が多いので整理しましょう。


シートが"元"、"OK"、"OK2"、"抽出"、"エラー"、"joblog"
とあるようですがそれぞれ甲Book、乙Bookどちらのシートでしょうか?

最初の質問にあった”ア”、”イ”のシートは"OK"、"OK2"に
置き換えられたと考えて良いですか?


>1.マクロ11
>Sub test1()
の中で
>  With Worksheets("甲").Range("A1") '★ここのWithを整理したい。
これは Worksheets("元") のことですか?

>   ’★ここで、「甲.xlsは変更されています。保存しますか?」のMsgボックスが出てくるが、自動的にNo(保存しない)を選択して閉じたい
甲.xlsは保存しなくて良いのですか?


>2.マクロ12(1-2-1と1-2-2をくっつけました)
>Sub FromTo作成()
の内で

>  Set WS4 = Worksheets("抽出")
>  Set WS4 = Worksheets("エラー")
WS4は"エラー"シートになります。
"抽出"シートは変数名を変えないと設定されません


>  Dim FT As String
>  
>  With WS1.Range("A1")
>  FT = (WS1.Range("N2").Value = WS1.Range("P2").Value)
>
>  If FT = "False" Then
>    .Range("N1:N65536").Copy Destination:=WS2.Range("A1")
>    .Range("P1:P65536").Copy Destination:=WS2.Range("B1")
>    .Range("D1:D65536").Copy Destination:=WS2.Range("F1")
>    .Range("X1:X65536").Copy Destination:=WS2.Range("G1")
>    
>  Else
>    .Range("N1:N65536").Copy Destination:=WS2.Range("A1")
>    .Range("O1:O65536").Copy Destination:=WS2.Range("B1")
>    .Range("Q1:Q65536").Copy Destination:=WS2.Range("C1")
>    .Range("D1:D65536").Copy Destination:=WS2.Range("F1")
>    .Range("X1:X65536").Copy Destination:=WS2.Range("G1")
>  End If
>  End With
分岐の話は置いといて、まず「WS2」はマクロ「FromTo作成」の中で設定されていません。
また、分岐の両方の「Destination」が「WS2」になっています。
最初の質問でシート”イッチ”、”チガウ”に分かれていたので
それぞれ"抽出"、"エラー"になるのですか?
>  WS4.Activate
そうするとこれはどちらでしょう?

最後に、これらのコードは乙Bookから実行されると考えて良いですか?

【43844】Re:別シートのデータを条件別に取得
発言  モナ  - 06/10/26(木) 18:59 -

引用なし
パスワード
   あまりに間違いの多いコードで申し訳ありませんでした。
教えてもらう立場で、非常に失礼しました。
違うところからコピーしてしまったため、このように間違いだらけになってしまい本当にすいません。
以下文中に →で回答しました。


>シートが"元"、"OK"、"OK2"、"抽出"、"エラー"、"joblog"
>とあるようですがそれぞれ甲Book、乙Bookどちらのシートでしょうか?
→これは乙Bookです。マクロは乙Bookで動かしているものと考えてください。
甲Bookはデータを参照するためだけのものと考えてください。


>最初の質問にあった”ア”、”イ”のシートは"OK"、"OK2"に
>置き換えられたと考えて良いですか?
→そのとおりです。

>
>>1.マクロ11
>>Sub test1()
>の中で
>>  With Worksheets("甲").Range("A1") '★ここのWithを整理したい。
>これは Worksheets("元") のことですか?
→これは、甲BookのA1:B4を、乙BookのOKシート、OK2シートの同じ場所にコピーをさせる記述です。同じ記述の繰り返しなのでスマートにすっきりさせたいと思いました。


>>   ’★ここで、「甲.xlsは変更されています。保存しますか?」のMsgボックスが出てくるが、自動的にNo(保存しない)を選択して閉じたい
>甲.xlsは保存しなくて良いのですか?
→甲.xlsは参照するだけですので、基本的に保存更新はしたくありません。
フィルタがかかっている状態で閉じようとしたため、このようなメッセージが出ていました。

>>2.マクロ12(1-2-1と1-2-2をくっつけました)
>>Sub FromTo作成()
>の内で
>
>>  Set WS4 = Worksheets("抽出")
>>  Set WS4 = Worksheets("エラー")
>WS4は"エラー"シートになります。
>"抽出"シートは変数名を変えないと設定されません
→Set WS5 = Worksheets("エラー") の記述ミスです。


>>  Dim FT As String
>>  
>>  With WS1.Range("A1")
>>  FT = (WS1.Range("N2").Value = WS1.Range("P2").Value)
>>
>>  If FT = "False" Then
>>    .Range("N1:N65536").Copy Destination:=WS2.Range("A1")
>>    .Range("P1:P65536").Copy Destination:=WS2.Range("B1")
>>    .Range("D1:D65536").Copy Destination:=WS2.Range("F1")
>>    .Range("X1:X65536").Copy Destination:=WS2.Range("G1")
→ ×WS2 ○WS4です。
    
>>  Else
>>    .Range("N1:N65536").Copy Destination:=WS2.Range("A1")
>>    .Range("O1:O65536").Copy Destination:=WS2.Range("B1")
>>    .Range("Q1:Q65536").Copy Destination:=WS2.Range("C1")
>>    .Range("D1:D65536").Copy Destination:=WS2.Range("F1")
>>    .Range("X1:X65536").Copy Destination:=WS2.Range("G1")
→ ×WS2 ○WS5です。


>最初の質問でシート”イッチ”、”チガウ”に分かれていたので
>それぞれ"抽出"、"エラー"になるのですか?
>>  WS4.Activate
>そうするとこれはどちらでしょう?
→そのとおりです。イッチ=抽出、チガウ=エラーです。
 WS4.Activateは、抽出シートを最後に表示させたいと考えています。

>最後に、これらのコードは乙Bookから実行されると考えて良いですか?
→まさにそのとおりです。

今見返してもなんて失礼な質問投げだろうと本当に後悔しています。
それでも親切に噛み砕いてくだっさて感謝しています。
よろしくお願いします。

【43874】Re:別シートのデータを条件別に取得
発言  maverick  - 06/10/27(金) 11:58 -

引用なし
パスワード
   う〜ん、"元"シートは甲Bookだとばかり思っていたので、
逆に良く分からなくなってきました・・・

とりあえず各ブックのシート構成は
・乙Book
"元"、"OK"、"OK2"、"抽出"、"エラー"、"joblog"
・甲Book
"甲"(データ6万行)
ということですか?

そうすると、

>1.マクロ11
>Sub test1()
でやっているのは、
1.甲Bookの"甲"シートのA1:B4を、乙Bookの"OK"シート、"OK2"シートの同じ場所にコピー
2.乙Book内で、"joblog"からオートフィルターで抽出したものを"OK"シート、"OK2"シート、
  "元"シートにそれぞれ転記

>2.マクロ12(1-2-1と1-2-2をくっつけました)
>Sub FromTo作成()
でやっているのは、
1.乙Book内で、"元"シートの"N2"セルと"P2"セルを比較して条件分岐して
  "抽出"シート、または"エラー"シートに"元"シートの一部を転記

ということになります。
これでは甲Bookの"甲"シート(データ6万行)のデータは、”A1:B4”だけしか使われてなく、
6万行の意味が無くなってしまうので、たぶん違いますよね?


ということで、このままコードを書いても無駄に終わると思うので、
やりたいことを具体的に書いてみてください。

例)
インプットボックスに”ア”と入力されたら、甲Bookの"甲"シートの
A列で”ア”のものを抽出して乙Bookの"OK"シートに転記したい

それと、↓のような各シートのシートイメージがあると回答者もより回答しやすくなります。

    A    B   C    D    E    F
1   項目   品名  数量 金額  区分  備考
2   ア    A   3   1000  3   東京C
3   ウ    G   8   5000  0   東京B
4   エ    L   4   4000  2   大阪A
5   イ    W   1   8000  3   東京A
6   ア    F   5   2000  1   大阪B

【43895】Re:別シートのデータを条件別に取得
発言  モナ  - 06/10/28(土) 18:00 -

引用なし
パスワード
   すいません。
いろいろ考えていただいてありがとうございます。
ちょっとデータを整理して改めてレスし直します。
少々時間ください。

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