Excel VBA質問箱 IV

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

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


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

【29817】コンボボックスから抽出 琴葉 05/10/14(金) 10:48 質問[未読]
【29820】Re:コンボボックスから抽出 Jaka 05/10/14(金) 11:24 発言[未読]
【29826】Re:コンボボックスから抽出 琴葉 05/10/14(金) 13:39 質問[未読]
【29851】Re:コンボボックスから抽出 Jaka 05/10/14(金) 17:27 回答[未読]
【29870】Re:コンボボックスから抽出 琴葉 05/10/15(土) 9:50 質問[未読]
【29943】Re:コンボボックスから抽出 Jaka 05/10/17(月) 13:54 回答[未読]
【30004】Re:コンボボックスから抽出 琴葉 05/10/18(火) 8:10 お礼[未読]
【29876】Re:コンボボックスから抽出 琴葉 05/10/15(土) 11:58 質問[未読]

【29817】コンボボックスから抽出
質問  琴葉  - 05/10/14(金) 10:48 -

引用なし
パスワード
   ユーザーフォーム上のコンボボックスからsheet("1")のレコードを検索、抽出したいのですがどうしたらよろしいでしょうか?

ユーザーフォーム上にCombo月、Combo番号、Combo科目と3個あります。
抽出元データー範囲は、Range("A:G")です。
抽出先データー範囲は、sheet("2").Range("A:G")です。

コンボボックスは、3つのうち1個もしくは2個しか入力しないときがあります。

よろしくお願いいたします。

【29820】Re:コンボボックスから抽出
発言  Jaka  - 05/10/14(金) 11:24 -

引用なし
パスワード
   こんにちは。
オートフィルタで出来ると思います。

シートレイアウトやセルの表示形式なども記載してください。

【102】日付と期間をオートフィルタで抽出(修正版)
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=102;id=FAQ

【84】オートフィルタの絞込み 
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=84;id=FAQ

【29826】Re:コンボボックスから抽出
質問  琴葉  - 05/10/14(金) 13:39 -

引用なし
パスワード
   Jakaさんありがとうございます。
私のスキルでは理解できませんでした。

sheet("1")
A       B     C      D     E     F      G
日付     番号  借方金額  借方科目  摘  要  貸方科目  貸方金額
2005/10/14   1   100000    現金    @    **信用金庫  100000
2005/10/14   1    80000  当座預金    @    **信用金庫   80000
2005/10/14   2    65000  当座預金    @    **信用金庫   65000
2005/10/14   2    12000  当座預金    @       現金   12000
2005/11/20   2   100000  当座預金    @    **信用金庫  100000


sheet("2")
A   B   C    D    E   F     G     E
日付 番号 工事名  科 目  摘要  借方金額  貸方金額  残金

とあります。

これをユーザーフォーム上のCombo月、Combo番号、Combo科目があり、
たとえば10月の現金を抽出する場合、Combo月に10 Combo科目に現金と入力します。
この場合、sheet("1")の2行目、4行目にあたります。
これをsheet("2")に代入し、列がsheet("1")と異なるので列も移動しなければなりません。
工事名と残金はとりあえず今の段階では考えません。

さらに11月の番号2の信用金庫ですとか
全月の当座預金など、3つのコンボボックスのうち1個もしくは2個もしくは3個の条件を指定する場合があります。


以下フォームの記述です
Private Sub UserForm_Initialize()

  Combo月.ColumnCount = 1
  Combo月.AddItem "01"
  Combo月.AddItem "02"
  Combo月.AddItem "03"
  Combo月.AddItem "04"
  Combo月.AddItem "05"
  Combo月.AddItem "06"
  Combo月.AddItem "07"
  Combo月.AddItem "08"
  Combo月.AddItem "09"
  Combo月.AddItem "10"
  Combo月.AddItem "11"
  Combo月.AddItem "12"
  
  
  Combo工番.List = Sheets("【工番・科目リスト】").Range("A2:A100").Value
  Combo科目.List = Sheets("【工番・科目リスト】").Range("D2:D100").Value
  
End Sub 
   
長文になってしまいましたが、よろしくお願いいたします。

【29851】Re:コンボボックスから抽出
回答  Jaka  - 05/10/14(金) 17:27 -

引用なし
パスワード
   こんな感じに作っていってください。

10月分の番号2で、当座預金の物をオートフィルタしたとして、これをマクロ記録すると「Macro1」になります。
これを明確に手直しをし、表示されている部分だけを選択するように手を加えると「Macro2」のようになります。

Sub Macro1()
  Selection.AutoFilter Field:=1, Criteria1:=">=2005/10/1", Operator:=xlAnd _
    , Criteria2:="<=2005/10/31"
  Selection.AutoFilter Field:=2, Criteria1:="2"
  Selection.AutoFilter Field:=4, Criteria1:="当座預金"
End Sub

Sub Macro2()
  With Sheets(1)
    .AutoFilterMode = False
    With .Range("A1")            '↓10/1〜10/31でも良いけど、
                        '実行した時の年号として扱われます。
      .AutoFilter Field:=1, Criteria1:=">=2005/10/1", Operator:=xlAnd _
                , Criteria2:="<=2005/10/31"
      .AutoFilter Field:=2, Criteria1:="2"
      .AutoFilter Field:=4, Criteria1:="当座預金"
    End With
    With .AutoFilter.Range
       '選択してみました。
       .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Select
    End With
  End With
End Sub

これで、基本となる物が出来ました。
後は、指定した月の1日から月末の年号(yyyy/m/d)を割り出した物を変数に入れ、
コンボボックスより、番号、借方科目も変数に入れ、オートフィルタのコードに割り当ててやれば良いんです。

Dim 年 As Long, 月 As Long, 月初 As String
年 = Year(Now())
月 = Combo月.List(Combo月.ListIndex)  '変数の型が数値型なので数字の場合、数値に変換してくれます。
月初 = 年 & "/" & 月 & "/1"
月末 = Format(DateSerial(年, 月 + 1, 1) - 1, "yyyy/m/d")
MsgBox 月初 & vbLf & 月末

これでも良いですよ。
Combo月.List = Array("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12")

【29870】Re:コンボボックスから抽出
質問  琴葉  - 05/10/15(土) 9:50 -

引用なし
パスワード
   おはようございます。昨日はありがとうございます。
With .AutoFilter.Range
      
       .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Select'ここでエラーが出てしまうので
    
とりあえず下記のように、してみたのですがこれですと4行目がCombo科目.Text尚且つ6行目が
Combo科目.Textであるもの(両方を満たすもの)・・・・となってしまうのですが

4行目か6行目のどちらかがCombo科目.Textであるもの・・・を抽出するにはどうしたらよろしいでしょうか?
よろしくお願いいたします。

Private Sub CommandButton1_Click()
  With Sheets("【仕訳帳】")
    .AutoFilterMode = False
    With .Range("A1")
      .AutoFilter Field:=1, Criteria1:=">=2005/10/1", Operator:=xlAnd _
                , Criteria2:="<=2005/10/31"
      .AutoFilter Field:=2, Criteria1:=Combo工番.Text
      .AutoFilter Field:=4, Criteria1:=Combo科目.Text
      .AutoFilter Field:=6, Criteria1:=Combo科目.Text
    End With
   
  End With

End Sub

この方がスマートなのでこれにしました。
>Combo月.List = Array("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12")

【29876】Re:コンボボックスから抽出
質問  琴葉  - 05/10/15(土) 11:58 -

引用なし
パスワード
   ▼琴葉 さん:
>Jakaさんありがとうございます。
>私のスキルでは理解できませんでした。
間違えがありましたので、修正 追記させていただきます。
>sheet("1")
>A       B     C      D     E     F      G
>日付     番号  借方金額  借方科目  摘  要  貸方科目  貸方金額
>2005/10/14   1   100000    現金    @    **信用金庫  100000
>2005/10/14   1    80000  当座預金    @    **信用金庫   80000
>2005/10/14   2    65000  当座預金    @    **信用金庫   65000
>2005/10/14   2    12000  当座預金    @       現金   12000
>2005/11/20   2   100000  当座預金    @    **信用金庫  100000
>
>
>sheet("2")
>A   B   C    D    E   F     G     H
>日付 番号 工事名  科 目  摘要  借方金額  貸方金額  残金

A   B   C    D    E   F     G     H     I
日付 番号 工事名 相手科目 科 目  摘要  借方金額  貸方金額  残金
相手科目が抜けていました。

>とあります。
>
>これをユーザーフォーム上のCombo月、Combo番号、Combo科目があり、
>たとえば10月の現金を抽出する場合、Combo月に10 Combo科目に現金と入力します。
>この場合、sheet("1")の2行目、4行目にあたります。
2行目と5行目でした。
>これをsheet("2")に代入し、列がsheet("1")と異なるので列も移動しなければなりません。

sheet("2")
A       B   C    D    E   F     G     H     I
日付     番号 工事名 相手科目 科 目  摘要  借方金額  貸方金額  残金
2005/10/14  1      **信用金庫 現金  @    100000 
2005/10/14  2       当座預金 現金  @        12000 
上記のように表示したいです。

>工事名と残金はとりあえず今の段階では考えません。
>
>さらに11月の番号2の信用金庫ですとか
>全月の当座預金など、3つのコンボボックスのうち1個もしくは2個もしくは3個の条件を指定する場合があります。
>
>
>以下フォームの記述です
>Private Sub UserForm_Initialize()
>
>  Combo月.ColumnCount = 1
>  Combo月.AddItem "01"
>  Combo月.AddItem "02"
>  Combo月.AddItem "03"
>  Combo月.AddItem "04"
>  Combo月.AddItem "05"
>  Combo月.AddItem "06"
>  Combo月.AddItem "07"
>  Combo月.AddItem "08"
>  Combo月.AddItem "09"
>  Combo月.AddItem "10"
>  Combo月.AddItem "11"
>  Combo月.AddItem "12"
>  
>  
>  Combo工番.List = Sheets("【工番・科目リスト】").Range("A2:A100").Value
>  Combo科目.List = Sheets("【工番・科目リスト】").Range("D2:D100").Value
>  
>End Sub 
>   
>長文になってしまいましたが、よろしくお願いいたします。

【29943】Re:コンボボックスから抽出
回答  Jaka  - 05/10/17(月) 13:54 -

引用なし
パスワード
   >4行目か6行目のどちらかがCombo科目.Textであるもの・・・を抽出するにはどうしたらよろしいでしょうか?
違う列の物をOr検出できません。
作業列を使ってください。
下記コードを組み合わせて作ることになります。

例えば、H列にこんな感じの関数を入れて、
H列の「TRUE」をオートフィルタする。
(D列、F列のどちらかが「現金」の場合)

H2
=OR(D2="現金",F2="現金")

マクロだと
Range("H2").Resize(任意のサイズ).Formula = _
      "=OR(D2=""" & Combo科目.value & """,F2=""" & Combo科目.value & """)"

作業列を使えば、自分の抽出したい条件の関数を入れて、TRUEかFALSEのどちらかを抽出すれば良いので楽かと思います。

こんな風にして

'Application.ScreenUpdating = False
With Sheets("【仕訳帳】")
  .AutoFilterMode = False
  LastR = .Range("A65536").End(xlUp).Row
  With .Range("A1")
           '↓「H2」
     With .Offset(, 7)
       .Value = "適当な名"
       .Offset(1).Resize(LastR - 1).Value = ""
       .Offset(1).Resize(LastR - 1).Formula = "=OR(D2=""" & "現金" & """,F2=""" & "現金" & """)"
     End With
     .AutoFilter Field:=8, Criteria1:="TRUE"
  End With
  Set myrag = .Range("A2:A" & LastR).SpecialCells(xlCellTypeVisible)
  .AutoFilterMode = False

  '↓作業列のクリア。後で、コメントを外す。
  '.Range("A1").Offset(, 7).Resize(LastR).Value = ""

  For Each Cel In myrag
    'ここでどこに入れるのか判定して、適度な所にいれる。
    MsgBox "抽出された行 " & Cel.Row & vbLf & _
       "借方科目 " & Cel.Offset(, 3).Value & " " & Cel.Offset(, 3).Address & vbLf & _
       "貸方科目 " & Cel.Offset(, 5).Value & " " & Cel.Offset(, 5).Address
  Next
  
End With
Set myrag = Nothing
Application.ScreenUpdating = True

【30004】Re:コンボボックスから抽出
お礼  琴葉  - 05/10/18(火) 8:10 -

引用なし
パスワード
   Jakaさん、返信遅くなりました、ありがとうございます。

うまくいかないのでほかの方法で、やってみたいと思います。

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