[[20100327171634]] 『セル範囲の選択』(どかべん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セル範囲の選択』(どかべん)

 Excel2003/WindowsXP

 オートフィルタで検索したデータの、"B3:H3”から最下行のデータを選択して、
このデータを別のシートに貼り付けたいのですが、どうしてもできません。

  
前回([[20100322115402]])同様、VBAの質問でしょうか。
 
    Dim myRng As Range, myRow As Long
    Set myRng = Worksheets("Sheet1").AutoFilter.Range.SpecialCells(xlCellTypeVisible)
    myRow = myRng.SpecialCells(xlCellTypeLastCell).Row
    MsgBox Range(Cells(myRow, 2), Cells(myRow, 8)).Address
 
(みやほりん)(-_∂)b

 (みやほりん)(-_∂)bさん早速の回答有難うございます。また抜けていました。ごめんなさい。

 1,2行目は理解できますが(2行目は「シート1のオートフィルタで検索した見えている部分の
セル範囲」ということですよね。)それ以下の行について範囲の指定の仕方は、これしかないですか?
もう少し解りやすい指定の仕方はないですか。もしあるのならコードが長くなってもOKですので、
それを教えていただけないでしょうか。

 教えていただいたコードを、私の作成したコードに入れ替えて作成した物と入れ替えて、テストは
して見ますが、時間がかかりそうなのでその結果がわかる前に再度質問をさせていただきました。
わがままを言ってすみません。(どかべん)


 >これしかないですか?
たぶんもっとあるでしょうね。
3行目が解りにくいのに、「1,2行目は理解できます」という言葉は
そのまま鵜呑みにできないのですが・・・。
 
    Dim myRow As Long, i As Long
    With Worksheets("Sheet1")
        With .AutoFilter.Range
            myRow = .Cells(.Cells.Count).Row
        End With
        For i = myRow To 1 Step -1
            If .Cells(i, 1).EntireRow.Hidden = False Then
                MsgBox .Range(.Cells(i, 2), .Cells(i, 8)).Address
                Exit For
            End If
        Next i
    End With
 
ちなみに、最初に提示したものも、↑も「別のシートに貼り付け」はしていません。
「オートフィルタで検索したデータの、"B3:H3”から最下行のデータ」のセルアドレス
がメッセージボックスに表示されるだけ。
 
(みやほりん)(-_∂)b ちろっと修正。

 (みやほりん)(-_∂)bさん教え方に険がありますね。それも仕方内ですね。私は教えていただいて
いるのですから。

 もっと解りやすいコードがあると思っていたのですが。(どかべん)

 目的は、フィルタ後表示されているセルデータを
 別シートに貼り付ける事ですよね?

 いきなり組み込むのではなく
 コードを実行して、どのコードで何が得られるのか
 確認して見るのが良いと思いますが。。。

 >「シート1のオートフィルタで検索した見えている部分のセル範囲」
 が分かると言う事は、コピーするセル範囲が分かる と言う事では?

 それと
 >どうしてもできません。
 と言葉だけでなく、
 その時に試してみた上手く行かないコードの内のいくつか(1つでも)
 載せておかれると良いと思いますよ。

 (HANA)


 >もっと解りやすいコード

 どんなコードなら↑なのか、例を示されれば回答者へ伝わるのでは。

 (mitsu)

 こちらへ続いたと思います。
[[20100328082650]] 『オートフィルタ検索データのコピー』(どかべん)

 (HANA)

 極論を言うとわかりやすいコードというのは、コードを書いている本人にしかかけません。
私も自分にとってわかりやすいコードしか書けません。
で、結果の出るコードは提示してあります。
解らないので、解説してください、というやり取りはこれまで何度も経験があります。
質問者がコードを理解する手助けはできると思います。
が、解らないので、もっと簡単なコードを、というのは初めてで、戸惑います。
「解りにくい」と感じられるのであれば、それはあなたの能力を測る限界がその程度であって、
私にはその能力を超えたことはできないからです。出し惜しみしているわけではありません。
これ以上は超能力がないとお付き合いできないようなので、私は退散させていただきます。 
  
(みやほりん)(-_∂)b


 (みやほりん)(-_∂)bさん返事有難うございます。これでおしまいかと思っていましたが、ご返事が
いただけました。いろいろと私が書いた言葉は、雑魚のたわごとと聞き流していただいていたと
思っていましたが、真剣にとらえていらっしゃることを知って陳謝いたします。いまさらながらですが
「ごめんなさい。」
 しかし、私もマクロを(みやほりん)(-_∂)bさんのように、自由に操ることを目指しています。そこで
マクロについて一つ質問をさせてください。

 今作成しているマクロコードでどうしてもうまくできないことがあります(これはマクロの初級者の
ためだと思いますが。)。それはオートフィルタで検索したデータを範囲を指定して、別シートに
貼り付けるとき、検索したデータがないと、空白セルを貼り付けるため、貼り付けシートにまとめ
行を作成していますが、それも空白行を貼り付けるため、消してしまうということです。それを
避けるため、If文を使用していますが、それでも期待どうり作動する、マクロと消してしまう
マクロがあります。その二つのマクロを表示します。

 正常に作動するマクロ

  Selection.AutoFilter Field:=10, Criteria1:="商品名"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
    If 下 = Rows.Count Then
     Sheets("原本").Select
    Selection.AutoFilter Field:=10, Criteria1:="サンプル名"

 まとめ行を消してしまうマクロ

 Selection.AutoFilter Field:=10, Criteria1:="商品名"
    Selection.SpecialCells(xlCellTypeVisible).Select
    Range("C6", Range("h6").End(xlDown)).Select
      If Selection.Rows.Count  Then
    Sheets("原本").Select
    Selection.AutoFilter Field:=10, Criteria1:="サンプル名"

 です。これはなぜですか。正常に作動するマクロは非常に長い物になっています。
これを短くするための質問です。もう少し広い範囲の表示が必要ならおっしゃって
ください。表示します。

 本来なら新しい質問コーナーを設けてこれを質問しようとしていましたが、ご返事を見つけて
ここで質問を続けることにしました。ぜひご回答をお願いいたします。(どかべん)


 頻繁にマクロが長いことを気にしていらっしゃいますが、
「技巧を凝らして短いけれども使っている本人が理解し切れていないマクロ」と
「長ったらしくて稚拙だが、本人はよく理解しているマクロ」の二つのどちらがベターか、
と聞かれれば、私は後者を選びます。理解できていて、期待通りに動いていれば、
それで良いじゃん。売り物にするわけじゃないんでしょうから。
 
それはさておき。
根本的な原因は、やはりデバッグのスキルをつけなければいけない、ということと、
正確なステートメント記述を「徐々に」身に付けることです。
いや、私も「なんとなく」「たぶん」でコーディングしますが、「なんとなく」
「たぶん」の部分はデバッグする習慣があるので、自分で気がつくことができます。
 
ご提示のコードについて書きます。
コピーや貼り付けのステートメントが提示されていないので、判断しにくいのですが、
コメントできるものだけ。
「まとめ行を消してしまうマクロ」
(1)次の2行はまったく関係がない。
    Selection.SpecialCells(xlCellTypeVisible).Select 'この一行は消しても結果が変わらない
    Range("C6", Range("h6").End(xlDown)).Select 
 これはステップインデバッグにより確認すべきです。
 
(2)つぎのIfステートメントは必ず条件がTrueとみなされる。
      If Selection.Rows.Count  Then
 Selection.Rows.Count  の部分には本来、Boolean型(True、False)の結果が返る
 条件式でなければなりませんが、Selection.Rows.Countで得られるのは「数値」です。
 条件式の結果を数値で代替した場合、0をFalse、0以外の数値をTrueとみなして
 処理が進められますが、Selection.Rows.Countは0になることはないので、
 必ずTrueの処理が行われます。
     If 下 = Rows.Count Then
 との違いがわからない、ということであれば、Ifの条件式や論理値というものの
 理解が不十分、ということがわかります。
 
(3)下記の一行
    Range("C6", Range("h6").End(xlDown)).Select
 ここでSelectされる範囲を後でコピーしていると推測しますが、
 H6セル以下に表示データがない場合は、シート最終行まで選択されてしまいます。
 End(xlDown)、End(xlUp)はそれぞれCtrlを押しながら↓、Ctrlを押しながら↑のキー操作に
 よるジャンプに相当しますが、ジャンプをストップさせるデータがない場合は、それぞれ
 最終行、先頭行にまで飛んでしまいます。
 
(4)私が結論を出してしまうと、
    Selection.SpecialCells(xlCellTypeVisible).Select
    Range("C6", Range("h6").End(xlDown)).Select
 この2行の代替が一番先に提案したものになってしまいます。
    Dim myRng As Range, myRow As Long
    Set myRng = Worksheets("Sheet1").AutoFilter.Range.SpecialCells(xlCellTypeVisible)
    myRow = myRng.SpecialCells(xlCellTypeLastCell).Row
    Range(Cells(myRow, 3), Cells(myRow, 8)).Select
 ただし、このステートメントは[どかべん]さんにはオーバーテクノロジーだったようです。
 
(5)では、
    If 下 = Rows.Count Then
 では正常に動作しているのですから、
    If Selection.Rows.Count  Then
 これが期待通りに動かない原因です。(書いたとおりに動いているのです・・・これを認めないといけない)
 Selection.Rows.Count はRange("C6", Range("h6").End(xlDown)).Selectで選択される
 セル範囲の行数を取得しています。何もデータがない場合にはここがどんな数字になるのか、
 [どかべん]さん自身がわかっていないと、Selection.Rows.Countを使った分岐ができません。
  If Selection.Rows.Count  Then
   MsgBox Selection.Rows.Count
 このような形で、数字を確認することから始めてください。
(みやほりん)(-_∂)b 年度末処理でしばらく音信不通になります。

 (みやほりん)(-_∂)bさんごお忙しい中御返事有難うございます。

 今日、私もどうしても理解できないので、初心に帰ってマクロの動作をエクセルで行って見ました。
そこで
 If Selection.Rows.Count  Then
 に対応する部分で一つ疑問に思う部分がありました。
 Selection.AutoFilter Field:=10, Criteria1:="商品名"
 の前に
 Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
 というコードがあります。これをエクセルのオートフィルタで検索しようとしたところ
先の検索結果「商品名」と言う項目がありません。これでは
 Selection.AutoFilter Field:=10, Criteria1:="商品名"
    Selection.SpecialCells(xlCellTypeVisible).Select
    Range("C6", Range("h6").End(xlDown)).Select
      If Selection.Rows.Count  Then
 を行おうとしてもできません。これは(みやほりん)(-_∂)bさんのおっしゃっていることに通ずる
のではないでしょうか。いかがでしょうか?しかしこれに対する対応策は私には解りません。
考えた挙句、商品名はj列にあるのでCOUNTO IFを使用してJ列の「商品名」の数を数えて
0の場合は次に移るというようなコードも考えて見ましたが、私の力ではできませんでした。

 それとなぜ
 Selection.AutoFilter Field:=10, Criteria1:="商品名"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
    If 下 = Rows.Count Then
     Sheets("原本").Select
    Selection.AutoFilter Field:=10, Criteria1:="サンプル名"
 このコードでは正常に作動するのでしょうか?

 それともう一つ質問です。長いコードはPCの容量使用量も多いと聞いています。私の妄想ですか。
また、長いコードは処理スピードも遅くなるというのも私の思い過ごしですか?
 今回は欲深く三つもの質問をしてしまいました。(どかべん)


 最後の二つだけ。
 ものには程度というものがあります。

 >長いコードはPCの容量使用量も多いと聞いています。私の妄想ですか。
 1000 行のコードを書いても、1Mにもなりません。
 ディスクにしてもメモリにしても昨今のPCスペックにしたら微々たるものでしょう。

 >また、長いコードは処理スピードも遅くなるというのも私の思い過ごしですか?
 処理時間はステップ数や、それぞれの行の処理内容に依存します。
 3行のコードでも Filter を10000回ループすれば遅いでしょうが、
 1000 行のコードでも代入を1000 回するだけなら1瞬です。

 コードの無駄を省き、効率のよい処理を考えることは大切ですが、最初からあまり
 高望みせず、まずは自分がきちんと理解することを優先してはどうでしょうか。

 今回の程度のコードの差では体感できるレベルの差はまったくありません。
 (Mook)

 年間の勘定仕訳印刷の間、待ちぼうけなので時間が出来ました。
ナチュラル分語調なので、以下、固い書き方ですがお許しを。
 
(1)
まず、コードを解釈してみるべきである。
 Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
 「選択しているオブジェクトで13番目のフィールド、ComboBox1のTextプロパティ
  で取得される文字列でフィルタ抽出せよ」
 Selection.AutoFilter Field:=10, Criteria1:="商品名"
 「さらに選択しているオブジェクトで10番目のフィールド、"商品名"という文字
  列でフィルタ抽出せよ」
    Selection.SpecialCells(xlCellTypeVisible).Select
 「選択セル範囲で可視セルを選択せよ」
    Range("C6", Range("h6").End(xlDown)).Select
 「セルC6から、[セルH6からCtrl+↓でジャンプするセル]までを選択せよ」
      If Selection.Rows.Count  Then
 「もし [Selection.Rows.Countが0以外ならTrueとみなす] なら、Then以降の処理を成せ」
 (おそらく、Then〜End Ifが「検索したデータがないとき」の処理と推測する)
 
[問題点]
・可視セルを選択している意味がまったくない。
 (その後に[Range("C6", Range("h6").End(xlDown))]を選択しなおしている)
・Range("C6", Range("h6").End(xlDown))の範囲はオートフィルタと関係がない。
 C6:H6がフィルタ範囲に含まれるのかもしれないが、End(xlDown)自体は、
 本来抽出結果の最終行までを取得する目的のものではない。
・Selection.Rows.Count は1以上にしかならない(選択セル範囲の行数は0には絶対に
 ならない)ので、Ifステートメントとして破綻している。(If End If がないのと同じ)
 
[改善点]
・オートフィルタが適用されている範囲で表示されている状態を取得するプロパティを
 利用すべきである。
[サンプル]
    Dim myRng As Range, myRow As Long
    Set myRng = Worksheets("Sheet1").AutoFilter.Range.SpecialCells(xlCellTypeVisible)
    myRow = myRng.Cells(myRng.Cells.Count).Row
    If myRow = 1  Then
 
「Range型変数myRng、長整数型変数myRowを宣言する。
 Range型変数myRng に次の参照を格納する。 [Sheet1のオートフィルタが適用されている範囲の可視セル]
 長整数型変数myRowに次の値を格納する。[myRng(1)から数えて<myRngの最終セル数>番目のセルの行番号] 
 もし、[長整数型変数myRowに格納されている値が1に等しい場合]には Then以降の処理を成せ」
 
このうち、    myRow = myRng.Cells(myRng.Cells.Count).Row は「いかさま」である。
myRng.Cells.Countは間違いなく表示されているセルの数を数えているが、
myRng.Cells(myRng.Cells.Count)で取得されるセルは、実際に表示されるセルと関係なく、
myRng(1).Cells(myRng.Cells.Count/myRng.Columns.Count,myRng.Columns.Count)
である。結果得られるのは、myRng.Cells.Count/myRng.Columns.Countで得られる値と同じである。
したがって、myRng.Cells.Count/myRng.Columns.Count で取得する方が合理的と判断する。
 
(2)>このコードでは正常に作動するのでしょうか?
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
    If 下 = Rows.Count Then
この2行が破綻せずに機能しているからである。
「変数[下]に Cells(6,3)からCtrl+↓キーでジャンプするセルの行番号を格納する
 もし、変数[下]とワークシートの行数が同じであれば、Then以降の処理を成せ」
何も抽出されていないときはEnd(xlDown)では最終行までジャンプする。
最終行=ワークシートの行数なので、このときはThen以降の処理に入る。
ただし、End(xlDown)はフィルタで何行か抽出されていても、たまたまEnd(xlDown)する
フィールドに何も入力がなかったりすると、抽出されていない時と同じ挙動をするので、
「問題がある」と言う指摘は妥当なものと判断する。
 
(3)
そういう傾向もあるが、100%事実ではない。
たとえば、本校で回答していらっしゃるichinoseさんは私などよりも
実用を考えた長いコードをよく提示していらっしゃるけれども、決して
低速ではない。すごいスキルである。私など及びもつかない。
 
数学で例えると、微積分を知っているから複雑な計算が出来るのではない。
数の概念、四則演算から始まる、底辺のスキルがあるからである。
スキルは知識とは違う。
例えば、日本人の覚える九九は知識ではなく、スキルである。
数値インプットから計算して結果を出すのではなく、
繰り返し九九を発声させたり、ドリルをやったりすることで、
脳みそにそういう回路を作り上げてしまうのである。
数学的スキルを徐々に同心円状に広げていくことで、より複雑な問題を
とくことが可能である。
[どかべん]さんの混乱は、中心にぽっかりと穴が開いているのに、
外側の輪っかを広げようとしていることに起因しているように思える。
 
宝石を得たければ、通常、何百トンもの瓦礫の山を掘らなければならない。
確かに宝石を早く掘り当てる人もいるが、それは、掘る能力の差である。
然るに、掘る能力をつける修練もそういう人は別の分野でしているのである。
また、金を稼いで宝石を得る人もいる。そういう人も掘る、と言うこと以外で
修練を積んでいるから、金という手段を得ているのである。
 
で、何が言いたいかというと、中心の穴の部分を見極めるべきではないかと。
 
さて、印刷も終わったので「懺悔」いたします。
   myRow = myRng.SpecialCells(xlCellTypeLastCell).Row
このコードは必ずしもフィルタ最終行を取得できません。
編集履歴のある最終セルを取得してしまうので、明らかに間違いです。
誤った提案をしてしまい、誤解も招いていると思います。
このトピックをご覧の皆様、すみませんでした。
(みやほりん)(-_∂)b

 (みやほりん)(-_∂)bさんご多忙中、遅い時間にかかわらずお疲れの中ご回答感謝いたします。
今回は私のようなマクロに対して初級者に非常にわかりやすく説明いただき回答内容については
よく理解できました。ただ、私の示したマクロコードが部分的なもののため、ご教授いただいた
ことを実際にどのように修正すればよいのかいろいろ試してみましたが、うまく行きません。
そこでここに私の作成したコードを長くなりますがすべて貼り付けます。全体像から見てご教授願います。

 Option Explicit
Private Sub CommandButton1_Click()
 Dim 検索開始日 As String, 検索終了日 As String
    検索開始日 = ">=" & UserForm2.TextBox1.Text
    検索終了日 = "<=" & UserForm2.TextBox2.Text

  If UserForm2.TextBox1.Text = "" Then
    MsgBox "検索開始日を記入してください。"
  Else
  If UserForm2.TextBox2.Text = "" Then
    MsgBox "検索終了日を記入してください。"
  Else
  If UserForm2.ComboBox1.Text = "" Then
    MsgBox "メーカーを選んでください。"
  Else
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7:f35").Select
    Selection.ClearContents
    Range("h7:h35").Select
    Selection.ClearContents
    Range("a45:f54").Select
    Selection.ClearContents
    Range("h45:h54").Select
    Selection.ClearContents
    Sheets("原本").Select
    Range("A5").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="商品名"
    Selection.SpecialCells(xlCellTypeVisible).Select
    Range("C6", Range("h6").End(xlDown)).Select
      If Selection.Rows.Count = 1 Then
        Selection.AutoFilter Field:=10, Criteria1:="サンプル名"
     Range("C6", Range("h6").End(xlDown)).Select
      If Selection.Rows.Count = 1 Then
     Sheets("原本").Select
    Selection.AutoFilter
    Range("a1").Select
    Exit Sub
      End If
     Selection.Copy
     Sheets(UserForm2.ComboBox1.Text).Select
     Range("A45").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
     Sheets("原本").Select
    Application.CutCopyMode = False
     Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy
     Sheets(UserForm2.ComboBox1.Text).Select
     Range("h45").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("原本").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Range("a1").Select
    Exit Sub
      End If
     Selection.Copy
     Sheets(UserForm2.ComboBox1.Text).Select
     Range("A7").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("原本").Select
    Application.CutCopyMode = False
     Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy
     Sheets(UserForm2.ComboBox1.Text).Select
     Range("h7").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("原本").Select
    Application.CutCopyMode = False
    Selection.AutoFilter Field:=10, Criteria1:="サンプル名"
     Range("C6", Range("h6").End(xlDown)).Select
     If Selection.Rows.Count = 0 Then   
        Sheets("原本").Select
        Range("a1").Select
     Exit Sub
     End If
     Selection.Copy
     Sheets(UserForm2.ComboBox1.Text).Select
     Range("A45").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("原本").Select
    Application.CutCopyMode = False
     Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy
     Sheets(UserForm2.ComboBox1.Text).Select
     Range("h45").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("原本").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Range("a1").Select
    End If
    End If
    End If
    Sheets("原本").Select
End Sub

 このコードでエラーなく作動しますが、Sheets(UserForm2.ComboBox1.Text)に貼り付けたとき
このシートのフォームを崩してしまいます。

 次にもう一つ私のマクロに対する認識が間違っていたことを反省いたします。お二人の方から
其の指摘をいただき私の理解が間違っていることを確認いたしました。このことによりこの
コーナーでの私の質問で私の頑固さによりご回答いただいた皆様に非常に不愉快な気分にさせた
ことを改めてお詫び申し上げます。マクロに対して、またPCに対して基本的なことの理解に
誤りがあると全く違った方向に行ってしまうということを経験いたしました。今後もそのような
ことがあるかも知れませんが、もしそのような片鱗が見えたときはどんどんご指摘ください。
私はそれを正さない限り、ご回答いただいている皆様のレベルには達することができませんから。
絶対に達したいのです。(どかべん)

 出来るだけ、セレクトしないコードにするのが良いと思います。
  単純に無くしてくっつけただけでは駄目な所も有りますが
  多くの部分で ○○.Select ・・・・ Selection.×× は
   ○○.×× と書き換えられます。

 コードの処理速度を遅くする代表的な原因として
 「選択」があげられます。

 Office TANAKA - Excel VBA高速化テクニック[Selectするな]
http://officetanaka.net/excel/vba/speed/s2.htm

 それから、インデントをきちんと付けるようにすると、
 それだけで、コードの可読性があがると思います。

 (HANA)

 HANAさんのコメントに少し私に迷いが生じました。マクロの作成の仕方でその処理速度に影響が
場合によっては2割も長くなると示されていました。たとえそれが0.1秒だとしても割合としては
非常に大きいものだと思います。エコの時代です。それも大切にしなければいけませんが、今の
私は、まずエラーの出ないマクロを作成することに専念したいと思います。しかし「選択」の
使用については私にも実践できますので、マクロの作成に取り入れて行きたいと思います。
それ以上のことは、もう少しマクロ作成が上達した時点で実践したいと思います。(どかべん)

      If Selection.Rows.Count = 0 Then   
こう言うことは成り立ちませんよ、と申し上げましたよね。
 
     Range("C6", Range("h6").End(xlDown)).Select
      If Selection.Rows.Count = 1 Then
これも、Selection.Rows.Count = 1 になることはありえないです。
(If myRow = 1  Then を真似たのかもしれませんが)
Selection.Rows.Count がどんな値になるときに、「うまくいかない」のか
「自分で確認をしてほしい」です。
 
Selectionを多用すると、速度云々よりも、まずは読みにくい。
「あれ」「それ」を多用した文章が読みにくいのと同じです。
読みにくいコードを読みにくいまま使うのだから、理解も進みません。
 
いったん、この作業から離れるべきです。
まず、最低でも次のポイントをクリアしてはいかがでしょうか。
  
記録したマクロから、Select、Selectionを排除するスキルをつける。
With 〜 End With ステートメントを使いこなすスキルをつける。
オブジェクト変数を使いこなすスキルをつける。
ステップ実行、ローカルウィンドウ、ウォッチ式、等のデバッグのスキルをつける。
 
(みやほりん)(-_∂)b


 (みやほりん)(-_∂)bさん有難うございます。以前ご指導いただいた、コードを私なりに、
コードの中に取り入れ、コードの中のSelectionを省いたものを作成して見ました。
それでもIf myRow = 1  Thenの数値を使用した3箇所すべてを0にし其の後「原本」シートに戻り
Exit Subするのですが、それでも空白行を指定シートに貼り付けてしまいます。
また原本k列の項目を、貼り付け指定シートh7に貼り付けます。
次の2項目目のk列の検索項目のない場合は貼り付けシートでは何も行っていないようで其の部分の
崩れはありません。数値を1にしても結果は同じです。
 またIf myRow = 1  Thenの数値を 1個目を0 あと2箇所をIf myRow  Then とすると、1項目目の
検索データがある場合は2項目目の検索データの有無にかかわらず正常な作動をします。
ただし、1項目目のデータがない場合は空白行を貼り付け2項目目は検索すら行いません。
 私の作成したコードの抜粋を次に示します。全体的な構造は以前示したものと
同じです。このコードでもマクロの作動のエラーは出ません。

 Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Set myRng = Worksheets("原本").AutoFilter.Range.SpecialCells(xlCellTypeVisible)
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="商品名"
    myRow = myRng.Cells(myRng.Cells.Count).Row
 If myRow = 0 Then
    Selection.AutoFilter Field:=10, Criteria1:="サンプル名"
    myRow = myRng.Cells(myRng.Cells.Count).Row
  If myRow Then
    Sheets("原本").Select
    Selection.AutoFilter
    Range("a1").Select
   Exit Sub
  End If

 しつこくてすみません。もしよろしければ、正解そのものをご教授ください。
 今、参考書を読み返しています。基礎編はほぼ読み終わります。次に関数編、応用編と
読み進みたいと思います。其の過程において、私の間違っていたところは何か考えたいと
思います。(どかべん)


 >正解そのものをご教授ください。
 正直申し上げると、提示されているコードが[どかべん]さんが期待している
 動作を反映しているものかどうか、確かめる術がありません。(データも手元にない)
 乱在しているSelectionがそれぞれ、期待するSelectionなのかどうかも現状では不明です。
 そういう状態のコード整理に、単に「それらしき」コードを足しても、
 動かないでしょうね。
下記はHANAさんのコメントの直前のコードを基にしています。
 
 Option Explicit
 Private Sub CommandButton1_Click()
     Dim 検索開始日 As String, 検索終了日 As String
     Dim myMsg As String, MyWS As Worksheet

     検索開始日 = ">=" & UserForm2.TextBox1.Text
     検索終了日 = "<=" & UserForm2.TextBox2.Text
     Sheets("原本").Select
     Select Case True
         Case Is = UserForm2.TextBox1.Text = ""
             myMsg "検索開始日を記入してください。"
         Case Is = UserForm2.TextBox2.Text = ""
             myMsg "検索終了日を記入してください。"
         Case Is = UserForm2.ComboBox1.Text = ""
             myMsg "メーカーを選んでください。"
     End Select
     If Len(myMsg) > 0 Then
         MsgBox myMsg
         Exit Sub
     End If

     Set MyWS = Sheets(UserForm2.ComboBox1.Text)
     MyWS.Range("A7:f35,h7:h35,a45:f54,h45:h54").ClearContents

     With Sheets("原本")
         .Range("A5").AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, Criteria2:=検索終了日
         .AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
         .AutoFilter Field:=10, Criteria1:="商品名"
    '     .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Select  この行は不要(1)
    '    ↓のIfブロックの条件分岐がどのような時行われるのか、本人が理解していない(2)
         If .Range("C6", Range("h6").End(xlDown)).Rows.Count = 1 Then
             .AutoFilter Field:=10, Criteria1:="サンプル名"
            ' 途中でExit Subする条件分岐は解りにくくする原因。(3)
            ' If .Range("C6", Range("h6").End(xlDown)).Rows.Count = 1 Then
            '     Application.Goto reference:=.Range("a1")  ' (A)
            '     .AutoFilterMode = False                   ' (B)
            '     Exit Sub
            ' End If
             .Range("C6", Range("h6").End(xlDown)).Copy
             MyWS.Range("A45").PasteSpecial Paste:=xlPasteValues

             .Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy
             MyWS.Range("h45").PasteSpecial Paste:=xlPasteValues

         Else
             .Range("C6", Range("h6").End(xlDown)).Copy
             MyWS.Range("A7").PasteSpecial Paste:=xlPasteValues

             .Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy
             MyWS.Range("h7").PasteSpecial Paste:=xlPasteValues

             .AutoFilter Field:=10, Criteria1:="サンプル名"
            ' 途中でExit Subする条件分岐は解りにくくする原因。(4)
            ' If .Range("C6", Range("h6").End(xlDown)).Rows.Count = 0 Then
            '     Application.Goto reference:=.Range("a1")  ' (A)
            '     .AutoFilterMode = False                   ' (B)
            '     Exit Sub
            ' End If
             .Range("C6", Range("h6").End(xlDown)).Copy
             MyWS.Range("A45").PasteSpecial Paste:=xlPasteValues

             .Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy
             MyWS.Range("h45").PasteSpecial Paste:=xlPasteValues
         End If
         Application.Goto reference:=.Range("a1")  ' (A)
         .AutoFilterMode = False                   ' (B)
     End With
     Application.CutCopyMode = False
 End Sub
 
基のコードを素直に解釈して私なりに整理していくとこうなりました。
整理はしましたが、動かないと思います。
今回は、VBE使わずに書き換えましたので・・・。
冒頭のIfブロック3連発はSelect Caseに置き換えてあります。
 
(1)はすでに意見を述べています。
(2)If関数の分岐そのものは理解してると信じていますが、その条件式の部分で
   Rows.Countが、どういう数値を返したときにどの処理をするのか、
   そういう部分が、わかっていないのではないか、と推測します。
(3)・(4)は、(2)と同じ理由で、よく考えてから条件式を書き直してください。
   また、途中でExit Subしているので(A)(B)同じコードが3箇所発生します。
 
 単純に書き直すと次のような構造になっていますが、
 
         If 条件Aのとき Then
             If 条件Bのとき Then
                 終了処理  ' (A)
                 Exit Sub
             End If
           条件Bでないときの処理
         Else
             If 条件Cのとき Then
                 終了処理  ' (A)
                 Exit Sub
             End If
           条件Cでないときの処理
         End If
         終了処理  ' (A)
 
  構造化を見直すと、これらは一箇所ですむはずです。
 
         If 条件Aのとき Then
             If 条件Bではないとき Then
             条件Bでないときの処理
             End If
         Else
             If 条件Cではないとき Then
             条件Cでないときの処理
             End If
         End If
         終了処理  ' (A)
 
End(xlup)、End(xlDown)の両方を使っていますが、使い分けの理由も知りたいですね。
>私の間違っていたところは
・・・だから、基礎をマスターしてないことなんだって。先を急がずに、
基礎編に書いてあることを「やってみる」ということをあと数度は繰り返してください。
(みやほりん)(-_∂)b

 (みやほりん)(-_∂)bさん有難うございます。

 (みやほりん)(-_∂)bさんご推察のとうりエラーが出ました。それで1部修正して実行しましたが
やはり検索データがない場合、空白をコピーして貼り付けるので、貼り付けシートのフォームが
乱れます。
 修正点は
 .AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
 にエラーマークが出たのでWith Sheets("原本")〜End With をはずしただけです。

 次に1つ質問です。
 If 条件Aのとき Then
             If 条件Bのとき Then
                 終了処理  ' (A)
                 Exit Sub
             End If
 の件ですが、私の行っている処理は条件(A),(B)の2個ですから条件(B)を
満足しないときはExit Subすればそれ以降の作業をマクロはストップするので効率がよいと
思っていました。これも私の勝手な認識でしたか?

 それと
 >End(xlup)、End(xlDown)の両方を使っていますが
 の件ですが、両者の使い分けで、最下行の取得でデータに空白行がある場合はEnd(xlup)、
しかし、あらかじめ最下行以下の空白セルに関数を設定した場合はNGと思い、
使い分けていました。

 今、参考書基礎編で勉強していますが、ちょうど「変数」ついてが出てきました。今まで皆さんに
教えてもらったことが、そのとうり出てきます。それで非常に理解しやすく、また新たな知らなかった
ことも、興味深く読み進むことができます。これも初心者だった私がこのコーナーを知りトラブルを
起こしながらも、皆様のアドバイスを受けてきたおかげと、感謝しています。(どかべん)


 こんにちは。
 直近のコードについて考えてみました。

 最初にE列でフィルタをかけていますね。
 Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd,Criteria2:=検索終了日

 E列でフィルタをかけた結果、見えている範囲をmyRngに代入しています。
     Set myRng = Worksheets("原本").AutoFilter.Range.SpecialCells(xlCellTypeVisible)

 M列でフィルタ、さらにJ列でフィルタ
     Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
     Selection.AutoFilter Field:=10, Criteria1:="商品名" 

 E列でフィルタをかけたとき見えていた範囲(myRng)の最終行、行番号をmyRowに代入しています。
     myRow = myRng.Cells(myRng.Cells.Count).Row

 まずはここまで考えてみます。
 わたしがつけたコメントだけ抜き出してみるとこうなります。
   まずE列でフィルタをかけていますね。
   E列でフィルタをかけた結果、見えている範囲をmyRngに代入しています。
   M列でフィルタ、さらにJ列でフィルタ
   E列でフィルタをかけたとき見えていた範囲(myRng)の最終行、行番号をmyRowに代入しています。
 M列とJ列でフィルタをかけた結果がmyRowにまったく影響をあたえませんが、これはどかべんさんの意図のとおりですか?

 なお、「E列でフィルタをかけたとき見えていた範囲(myRng)の最終行、行番号をmyRowに代入しています。」
 と書きましたが、本当にちゃんと代入できているかあやしいです。myRngのかたちによってはただしく代入できない
 場合があるのではないか、とわたしは疑っています。欲しい値が確実に代入できているか確認して下さい。

 続きを考えてみます。 

  If myRow = 0 Then
 現在myRowに入っているのは、最初にE列でフィルタをかけたとき見えていた範囲の最終行、行番号ですが
 myRow が 0 であるとはどういう状態でしょう?
 行番号が0であるような行があるでしょうか?
 ありませんね。
 したがって、このif節のコードは決して実行されません。
     Selection.AutoFilter Field:=10, Criteria1:="サンプル名"
     myRow = myRng.Cells(myRng.Cells.Count).Row
   If myRow Then
     Sheets("原本").Select
     Selection.AutoFilter
     Range("a1").Select
    Exit Sub
   End If

 −佳−

 >マクロはストップするので効率がよいと思っていました。
このように提案するのは次の理由です。
(1)しきりにコードが長いことを気にしていらっしゃるため。
   (同じ処理が3か所発生するので、その分コードは長くなる)
(2)頻繁にExit Subする構文はやはり読みにくい。
   Exit Subしなくて済むのなら、しないような構造にする。
 
>検索データがない場合、空白をコピーして貼り付けるので
うまく動くように編集しなおしたつもりはありません。
動作そのものは以前同様です。
 
>With Sheets("原本")〜End With をはずしただけです。
逆ですよ。はずさずに動く方法を考えるべきです。
半分意図的にやっているので。
みやほりん


 佳さん、みやほりんさん有難うございます。

 シート{原本」の検索データをComboBox1.Textシートシートに貼り付けるとき、
検索データがない場合、空白セルをすべて貼り付けるということに対して、
私は、難しいマクロコードある程度皆さんのご説明で内容は理解できますが、
まだまだなので、ほかの方法(私でも理解できる方法)で、いろんなことを
試してみました。そこで一つ気づいたことがあります。

 If〜thenが全く作動してないのではないかということです。
 その理由としてIf〜thenの後の作業として、検索データがない場合は検索データではなく
ほかの空白セルを貼り付けて見ました。

 If Range("C6", Range("h6").End(xlDown)).Rows.Count = 0 Then
 Range("j3:o3").Copy
     Sheets(UserForm2.ComboBox1.Text).Select
    Range("a7").Select
    ActiveSheet.Paste

 やっぱり、はりつけシートのフォームが崩れます。
 もう一度、条件分岐の使い方及びそれに対応するマクロコードの勉強を一からしようと思っています。
 もしほかこのトラブルに対する具体的な解決方法(マクロコード)があれば教えてください。
(どかべん) 


 >If〜thenが全く作動してないのではないかということです。
これについては、みやほりんも佳さんも同じことについて
すでに指摘しております。
Rows.Count が0になることは、「ドラえもんが目の前に現れる」のと
同じくらい、「ありえないこと」です。(と何回も違う表現で書いている)
 
条件分岐そのものではなくて、条件分岐の「Range("C6", Range("h6").End(xlDown)).Rows.Count = 0」
が不適切なのです。End(xlDown)そのものはフィルタと関係ない動作をするため。

[サンプル]で提示している、AutoFilter.Range.SpecialCells(xlCellTypeVisible)
で取得するのが適切です。
(みやほりん)(-_∂)b


 真ん中あたりでみやほりんさんも書かれてましたが、最初に身につけるべきは
 デバッグの方法かと思います。
 ステップ実行、変数の内容の確認ができるようになるだけでも、問題の
 ほとんどはご自身で 解決できるようになると思います。

 マクロを「書いてみた」「動かした」「ダメでした」。
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200.html
 (Mook)

 一般論は聞きたくないかもしれませんが。。。

 自転車が乗れるように成る為の本を読んでも、自転車が乗れる様にはなりません。
 数学の公式集を読んでも、数学の問題が解けるようには成りません。

 知識を得るために、本を読むことは大切だと思いますが
 読んだだけでは身に付きません。

 そしてたぶん、どかべんさんが勉強しようと思っている事の中に
 どかべんさんがこれからまず最初に身につければ良いと思っている事は
 入っていないのではないかと思います。

 書いたコードが思った様に動かない場合は
 コードがどの様に動いているのか確認する方法を知る必要があります。

 簡単なのは、ステップインで実行してみて貰う事です。
 コードの最初の方に「Stop」と一行入れて下さい。
 マクロが実行されると、この行にハイライトがつき、一旦実行が停止します。

 その後、[F8]キーを押すと、一行毎にコードが実行されます。
 すると、
 >If〜thenが全く作動してないのではないかということです。
 この辺りはご自身で目で見て確認出来ると思います。

 コードの長さや、処理速度など 気になる点も有る様ですが
 それより先に、思った様に動くコードを作る事を考えるのが良いと思います。

 現在出来ているコードが、何故思った様に動かないかと言うと
 このコードでこの様な動きをして貰いたい と言う思いと
 実際に動く動きが違っているからです。

 どこで何が違っているのか明確にするために
 まず、可変部分を固定にして(シート名や・データなど)
 どのシートの、どのセルに対して処理をしたいのか書いてみて下さい。

 また、
 >>If Range("C6", Range("h6").End(xlDown)).Rows.Count = 0 Then
 の様な条件部分の上には
 MsgBox Range("C6", Range("h6").End(xlDown)).Rows.Count
 の様に、値を確認するメッセージボックスを挿入して下さい。

 その後、ステップインで実行しながら、コードが選択するセルが
 思っているセルと一致するかどうか
 メッセージボックスの値が思った値に成っているか、確認して下さい。

 詳しい情報を教えていただければ
 コードを修正する事は出来ると思います。

 しかし、それでは どかべんさんはいつまでたっても
 ご自身の問題点(コードのではなく)が分からず
 いつまでたっても、本を読むことに成るでしょう。

 (HANA)

 >Range("C6", Range("h6").End(xlDown)).Rows.Count
 この部分だけちょっと解説

 まずRows.CountというのはRangeオブジェクトに対する行数のカウントなので
 Rangeオブジェクトが存在するいじょうは最低が1です。

 これが0の状態というのはオブジェクト変数であればNothingの状態であって
 直接Rangeオブジェクトを指定する場合はRange("").Rows.Countという意味のわからない状態です。
 これはオブジェクトが無いので当然エラーになります。

 で、これですがRange("C6", Range("h6").End(xlDown)).Rows.Count
 少なくともC6は絶対範囲に入ります。
 End(xlDown)で値が無い場合は最下行までいくので65531とかの値になりますし
 たとえばRange("C65536").End(xlDown).Rows.Countと、一番下の行からやっても
 C65536は含まれるので1が返ります。

 つまり、何をどうしても最低は1であってそれ以下はエラーになります。
 (それ以下というのは存在しませんので)

 コード自体の勉強も大切ですが、オブジェクトというものを意識していかないと
 今後のコーディングで悩む事にもなるかもしれません。

 (momo)


 今回はこんなにたくさんの方からご助言をいただき非常に感謝いたします。

 ただ今日私が疑問に思っていることに対して一つ解ったことがあります。それは

 Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="商品名"
  Selection.SpecialCells(xlCellTypeVisible).Select
    Range("C6", Range("h6").End(xlDown)).Select
      If Selection.Rows.Count = 1 Then

 の最後の行に対して条件分岐を行っていましたが、よく考えて見ると、

 Selection.AutoFilter Field:=10, Criteria1:="商品名"

 は、AutoFilterのComboBox1.Textの中に"商品名"自体が存在しないのですから、ほかの事で、
条件分岐を設定しても、マクロが反応するわけないですよね。そのことを、皆さんから指摘を
いただいていたようですが、私は全く解っていませんでした。

 今回いただいたご指導を実践して、何とかそれを探し出し、正常に作動するマクロコードを
完成させたいと思います。

 今後も今まで同様皆様方のご指導よろしくお願いいたします。まずはご指導いただいた皆様方に
御礼まで。
(どかべん)


 いろいろ試してみました。HANAさんにご教授いただいた、

 >簡単なのは、ステップインで実行してみて貰う事です。
 コードの最初の方に「Stop」と一行入れて下さい。
 マクロが実行されると、この行にハイライトがつき、一旦実行が停止します。

 その後、[F8]キーを押すと、一行毎にコードが実行されます。

 を実行して、マクロコードとそれに対するシートで行われていることが、非常にわかりやすかった
ので、それで確認いたしました。ただ、Else、End Sub があるととぎれましたが。

 それで解ったことですが、If〜thenでこのようにしなさいと指定しても、End If 以降でも
以前と同様のコードを指示するとそれに従ってしまいます。組み合わせは4種類あります。
「商品名」、「サンプル名」双方ある場合、どちらか片方の場合、双方共ない場合。

 これを解決するためには非常に高度なテクニックが必要と思われます。

  一つ考えて見ました。以前にも記しましたが、

 Selection.AutoFilter Field:=10, Criteria1:="商品名"

 の「商品名」の有無を判定して次に移ったほうが、単純なコードになるのではないかと
思ったのですが、いかがでしょうか?
 (どかべん)

 まず、他の人が見ても(データ状況があまり分からなくても)
 分かるようなコードにしてください。

 話はそれからにした方が良いと思います。

 Sheets(○○).Select を無くすのは難しいかもしれないので
 これは置いておくことにして。。。
 後の Selection で始まる部分がそれぞれ
 どのセルの事なのか書きなおしてみてください。

 それから、インデントも付けてください。

 コードが少しはすっきりして
 頭も少しすっきりすると思います。

 (HANA)

 >「商品名」の有無を判定して次に移ったほうが
フィルタの場合は件数チェックはフィルタ後の件数チェックになりますので、
私ならフィルタ後の状態をチェックします。
件数チェックに関しては色々な方法があります。
私ならSUBTOTALワークシート関数をワークシートに仕込んでおきます。
=SUBTOTAL(103,範囲) で、範囲内で入力のある表示セルの数をカウントすることができます。
「商品名」、「サンプル名」が表示される範囲をこの関数でチェックすれば、データの有無は判明します。
マクロの中で、この関数が入力されているセルの値によって分岐するようにすれば、
マクロそのものはその文簡単なコードになります。
(問題があるとすれば、マクロだけを読んでも、何のチェックなのか、わからないことですが)
 
>高度なテクニックが必要
そういう方向に行かないように。
今回の処理は、記録マクロ、Rangeオブジェクトのプロパティ・メソッドの利用の仕方、
条件分岐の仕方等の基礎的な部分の組み合わせで解決できますから、
今回の場合は、[どかべん]さんの(デバッグのやり方も含めた)基礎力不足、その応用力
不足が原因です。(厳しい書き方だけど、怒らないでね)
例えば、If Selection.Rows.Count = 0 Then がなぜ[どかべん]さんが思うように
分岐しないのだろう?とかいうことを、「思い込み、勘違いを含まない納得」まで深めて
おくことが大事です。
 
F1キーでのヘルプ参照も活用してください。 
(みやほりん)(-_∂)b

 HANAさん、(みやほりん)(-_∂)bご指摘有難うございます。

 私も少々頭が混乱してきており、基礎的なことさえ理解できなくなっているようです。
 もう少し冷静になって考えて見たいと思います。

 今、私は何がうまく行かなくてどうしたいのかまとめてみました。

 それは検索したデータがないときそれをそのまますごしたいのですが、どうしても検索した
空白データをすべて指定シートに貼り付けてしまいそのシートのフォームをくづしてしまうか、
見出し行のデータを貼り付けるという問題です。

 このことから考えると、初歩的なコード

 Range("C6", Range("h6").End(xlDown)).Copy・・・(フォームを崩します。)

 と、

 Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy・・・(見出しデータを貼り付けます。)

 の指定の仕方がが間違っているのではないかと思うのですがいかがでしょうか?
これ以外については正常にコードは作動いたします。

 もし、私の疑問があっているのなら、正解を教えてください。
 もしこの疑問さえ間違っているのなら別のコードで正常に作動していますので(以前そのコードは
表示したと思います。もしそのコードが必要なら再度提示いたします。)非常に残念ですが、
この質問については、私のマクロコードに対する知識の浅さだけを暴露した質問になりましたが 
次の機会に新たな質問で皆様のご指導をいただくことにいたします。
(どかべん)


 人の話を聴く気がありますか?

 同じコードでの同じ質問の過去ログを私はリンクしましたが、読みましたか?
   ・・・って言うか、もしかして全部同じ人?
 もう一度前半部分を読み返してもらうのが良いと思いますよ。
 分からない部分をそのままにして於いても分からないままでしょうから。

 その仕組みのコードにするのなら
 その処理(Copy処理)をするのかしないのか
 先に判断が必要に成るとおもいます。

 (HANA)


 (みやほりん)(-_∂)bさんにご教授いただいた、コードをようやく正常に作動するようにしました。
 そのコードは

 Private Sub CommandButton1_Click()
     Dim 検索開始日 As String, 検索終了日 As String
     Dim myMsg As String, MyWS As Worksheet

     検索開始日 = ">=" & UserForm2.TextBox1.Text
     検索終了日 = "<=" & UserForm2.TextBox2.Text
     Sheets("型代原本").Select
     Select Case True
         Case Is = UserForm2.TextBox1.Text = ""
             MsgBox((これを変更)) "検索開始日を記入してください。"
         Case Is = UserForm2.TextBox2.Text = ""
             MsgBox((これを変更)) "検索終了日を記入してください。"
         Case Is = UserForm2.ComboBox1.Text = ""
             MsgBox((これを変更)) "メーカーを選んでください。"
     End Select
     If Len(myMsg) > 0 Then
         MsgBox myMsg
         Exit Sub
     End If

     Set MyWS = Sheets(UserForm2.ComboBox1.Text)
     MyWS.Range("A7:f35,h7:h35,a45:f54,h45:h54").ClearContents

     With Sheets("原本")
         .Range("A5").AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, Criteria2:=検索終了日
         Selection((追加)).AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
         Selection((追加)).AutoFilter Field:=10, Criteria1:="商品名"
         If .Range("C6", Range("h6").End(xlDown)).Rows.Count = 1 Then
             .AutoFilter Field:=10, Criteria1:="サンプル名"
             .Range("C6", Range("h6").End(xlDown)).Copy
             MyWS.Range("A45").PasteSpecial Paste:=xlPasteValues

             .Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy
             MyWS.Range("h45").PasteSpecial Paste:=xlPasteValues

         Else
             .Range("C6", Range("h6").End(xlDown)).Copy
             MyWS.Range("A7").PasteSpecial Paste:=xlPasteValues

             .Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy
             MyWS.Range("h7").PasteSpecial Paste:=xlPasteValues

             Selection((追加)).AutoFilter Field:=10, Criteria1:="サンプル名"
             .Range("C6", Range("h6").End(xlDown)).Copy
             MyWS.Range("A45").PasteSpecial Paste:=xlPasteValues

             .Range("k6", Range("k" & Rows.Count).End(xlUp)).Copy
             MyWS.Range("h45").PasteSpecial Paste:=xlPasteValues
         End If
         Application.Goto reference:=.Range("a1")  
         .AutoFilterMode = False                   
     End With
     Application.CutCopyMode = False
 End Sub

 変更したところは(( ))で変更説明している部分です。前回修正して行ったのと違って、基本的な部分は
変更していないつもりですが、やはりオートフィルタでの検索データのない部分のコピーでは
貼り付けフォーマットを乱してしまいました。やはり変更の仕方が間違っていますか?

 それと今まで、いろんな対策コードを教えていただきましたが、何せ、初級者の私ですので、
作成コードのどこに挿入すればよいのか解らず、私なりに考えためしてみましたが、どれも失敗に
終わりました。

 しばらくの間、このコーナーでの質問は控えておりましたが、その間に、3個の新たなコードを
作成しましたが、それは皆さんに質問することなく作成し、正常に作動しています。
このことは、今まで皆様方からきつい言葉を受けながらも、ご指導いただいた賜物だと思います。
(どかべん)


 本当に正しく動いていますか?

 みやほりんさんの意図したコードは
      Select Case True
         Case Is = UserForm2.TextBox1.Text = ""
             myMsg = "検索開始日を記入してください。"
         Case Is = UserForm2.TextBox2.Text = ""
             myMsg = "検索終了日を記入してください。"
         Case Is = UserForm2.ComboBox1.Text = ""
              myMsg = "メーカーを選んでください。"
     End Select
     If Len(myMsg) > 0 Then
         MsgBox myMsg
         Exit Sub
     End If

 だと思いますが。

 先に提示されたみやほりんさんのコードで = が抜けていたのも、混乱の
 元だったとは思いますが、
 If Len(myMsg) > 0 Then
 が何をしているかに気がつくことができれば・・・、詮無いことですが。
 (Mook)

 >オートフィルタでの検索データのない部分のコピー
 に関してですが、少しずつ確認させてもらいたいと思います。

 そもそも、6行目がデータ開始行なのか 見出し行なのか良く分からないのですが
 どちらですか?

 それから、コード内にある Range("h6").End(xlDown) この部分ですが
 ワークシート上でご自身で操作してみる事は出来ますか?
  具体的には H6セルを選択して、Ctrl + ↓(二つのキーを同時に押す)
  のですが。

 (HANA)

 >されたみやほりんさんのコードで = が抜けていたのも、混乱の
 >元だったとは思いますが、
失礼しました。貼り付け後の確認が出来ていませんでした。すみません。
 
.Range("C6", Range("h6").End(xlDown)).Rows.Count = 1 
この条件が成り立つことがない、と言うのはすでに述べています。
>     Range("C6", Range("h6").End(xlDown)).Select
>      If Selection.Rows.Count = 1 Then
>これも、Selection.Rows.Count = 1 になることはありえないです。
 
(みやほりん)


 いつもながら早速のご返答有難うございます。

 Mookさん ご指摘の部分は私の質問の意図ではありません。この部分については私の作成した
コードでも作動していましたが、こういうコードもあるよということで修正していただいた部分です。
これについては、今回の問題が解決した後もう一度勉強いたします。

 (HANA)さん 6行目がデータの開始です。それとテストしてみました。結果は、いったんH6の
データのある最下行でいったんとまり、押し続けると最下行(H65536)を取得いたします。

 (みやほりん)さん If Selection.Rows.Count = 1 Thenの1を0に変更して
テストを行いましたが、結果は同じです。 
検索データ 

 Range("C6", Range("h6").End(xlDown))

 がないときはやはり空白行を貼り付け、貼り付けシートのフォームを乱しました。
また

 .Range("k6", Range("k" & Rows.Count).End(xlUp))

 にデータがないときは(K5)のデータを、貼り付けシートの(H6)に
貼り付けます。これはxlUp、xlDown どちらでも、結果は同じでした。
(どかべん)


 まず、
  コピーしなくて良いとき(抽出データが無いとき)は
  コピー処理をしないようにすれば良いじゃない
 と言う発想は有りますか?

 コードとしては
  If コピーが必要な時 Then
       コピー処理
   End If
 と言う形です。

 この条件部分に
  「.Range("C6", Range("h6").End(xlDown)).Rows.Count = 1」
 を使いたいのでしょうけど。。。
 ステップインで実行して貰うと分かりやすいと思いますが、
 コピーしなくて良い様な時でも、この判定で思った様に分岐せず
 コピー処理に進んで仕舞いますね?

 つまり、この条件では、【コピー処理が必要か必要でないか判断できていない】
 と言う事になります。
 でしたら、これは変更しないといけません。

 [1]ココまでは納得して頂けますか?

 もう一度
  .Range("C6", Range("h6").End(xlDown))
 の記述に関してですが

 [2]例えば、Range("C6", "H10").Select と書いてあったら
    どのセルが選択されるか分かりますか?

 [3]それから、Range("C6", "H6").Select と書いてあったら
    どのセルが選択されるか分かりますか?

 H6セルを選択して Ctrl + ↓ をすると
 >(HANA)さん 6行目がデータの開始です。それとテストしてみました。結果は、いったんH6の
 >データのある最下行でいったんとまり、押し続けると最下行(H65536)を取得いたします。
 この様な動きをしますが、これはフィルタ結果が有る(或いはフィルタがかかってない)
 状態での挙動ですね?

 [4]フィルタ結果が無い状態で、もう一度同じ操作をやって下さい。

 とはいえ、H6セルが非表示に成ってからは普通に選択出来ないので
 先に選択しておいて非表示にするか
 名前ボックスに H6 と入れてジャンプした後操作して下さい。

 (HANA)


 意図されたかされないかは存じませんが、((これを変更)) とまで記載されていた
 ので、間違いを指摘させていただきました。

 xlUp、xlDown に関しては『連続データが2つ以上あり、間に空白がなければ』
 どちらも同じ結果になります。
 逆をいえば、上記の条件に合わないとき別の結果を示すということです。

 このあたりは、いろいろなケースを実際に手を動かして確認しないと
 なかなか身につかないと思います。
 (Mook)

 >If Selection.Rows.Count = 1 Thenの1を0に変更して
 
私は次のようにも書いていますよね。
 >Rows.Count が0になることは、「ドラえもんが目の前に現れる」のと
 >同じくらい、「ありえないこと」です。(と何回も違う表現で書いている)
 >条件分岐そのものではなくて、条件分岐の「Range("C6", Range("h6").End(xlDown)).Rows.Count = 0」
 >が不適切なのです。
 
End(xlDown)は
「あるセルを選択した状態で、Ctrl+↓キー を押したときに
アクティブセルが移動するセル」を取得します。
この現実と、どかべんさんのRange("C6", Range("h6").End(xlDown)).Rows.Count 
に対して抱いているイメージがかなり乖離していると言わざるを得ません。
 
Sub Test()
Range("C6", Range("h6").End(xlDown)).Select
End Sub
 
このプロシージャを実行したときに
h6が空白のとき、h6にデータがあるとき、h6:h7にデータがあるとき、
h6とh10にデータがあるとき、と言う風に、いろんなケースで
どんな範囲が選択されるか、よく確認してみてください。
そして、選択されたセル範囲の行数が「0」や「1」になるか、
自分の目で見てみることです。
(みやほりん)

 ご返事有難うございます。

 しかし、今までのご指導を元に私なりにいろいろ考えました。今回のHANAさんの、
ご指導がヒントになっていますが、

 Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="商品名"

 Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
 で、検索結果、"商品名"がなければそれでいくらその後の処理をしようとマクロは、

 Range("C6", Range("h6").End(xlDown)).Select

 と書き込んでも反応しないのではないかと考え、

 Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text

 以後を変えて、コードを作り作動させたところ、私の思いどうりの処理をするコードになりました。
今までのコードでも正常に作動するコードがあるのでしょうか?

 基本的なところで、皆様のご指導に対して違う方法にになって、非常に失礼な行動と思いますが、
お許しください。今までのご指導の方法でもできるのであれば、続けてご指導願います。

 もし、私が作成したコードがご覧になりたいならおっしゃってください。非常に稚拙でみっともない
コードですが、明示いたします。そのときは、「このコードはここは間違っているよ。」また
また「ここはこのように直したほうがいいよ。」という点があればご指摘ください。
今後の勉強のために。
(どかべん)


 アドバイスをもらえないという、貴方のデメリットだけですので、
 載せたくなければ載せなくてもいいです。
 意図通り動いているのであれば、とりあえずは正しいコードです。
 そのデータに限っては、という条件がつくかもしれませんが。
 (かつ)

 どの様に変更なさったのか分かりませんが
 ご自身の問題点は分かったのでしょうか?

 (HANA)

 HANAさん、自分なりに問題点を見つけたつもりですが、全く違った方向の理解かも知れませんので
私の作成したコードを次に記してみます。(かなりはづかしいコードですが。)

 Option Explicit
 Private Sub CommandButton11_Click()
 Dim 検索開始日 As String, 検索終了日 As String
    検索開始日 = ">=" & UserForm2.TextBox1.Text
    検索終了日 = "<=" & UserForm2.TextBox2.Text

  If UserForm2.TextBox1.Text = "" Then
     MsgBox "検索開始日を記入してください。"
   Else
   If UserForm2.TextBox2.Text = "" Then
      MsgBox "検索終了日を記入してください。"
    Else
    If UserForm2.ComboBox1.Text = "" Then
       MsgBox "メーカーを選んでください。"
     Else
     Sheets(UserForm2.ComboBox1.Text).Select
     Range("A7:f35,h7:h35,a45:f54,h45:h54").ClearContents

     Sheets("原本").Select
     Range("ae7:ae100").ClearContents
     Range("A5").Select
     Selection.AutoFilter
     Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
     Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
     Range("J6", Range("J65536").End(xlUp)).Select
     Selection.Copy
    Range("ae7").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Range("ae6").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R[1]C:R[100]C,""商品名"")"
    Range("ae6").Select
    Selection.Copy
    Range("J2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("J2").Select

 If Range("J2").Value = 0 Then
     Sheets("原本").Select
     Range("A1").Select

  Else
   If Range("J2").Value >= 1 Then
     Selection.AutoFilter Field:=10, Criteria1:="商品名"
        Range("C6", Range("h65536").End(xlUp)).Copy
        Sheets(UserForm2.ComboBox1.Text).Select
        Range("A7").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Sheets("原本").Select
        Application.CutCopyMode = False
        Range("k6", Range("k65536").End(xlUp)).Copy
        Sheets(UserForm2.ComboBox1.Text).Select
        Range("h7").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
           :=False, Transpose:=False
   End If
End If

     Sheets("原本").Select
     Range("ae7:ae100").ClearContents
     Range("A5").Select
     Selection.AutoFilter
     Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
     Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
     Range("J6", Range("J65536").End(xlUp)).Select
     Selection.Copy
    Range("ae7").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Range("ae6").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R[1]C:R[100]C,""サンプル名"")"
    Range("ae6").Select
    Selection.Copy
    Range("J2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("J2").Select

 If Range("J2").Value = 0 Then
     Sheets("原本").Select
     Range("A1").Select
   Else

    If Range("J2").Value >= 1 Then
     Selection.AutoFilter Field:=10, Criteria1:="サンプル名"
          Range("C6", Range("h65536").End(xlUp)).Copy
          Sheets(UserForm2.ComboBox1.Text).Select
          Range("A45").Select
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
               :=False, Transpose:=False

        Sheets("原本").Select
          Application.CutCopyMode = False
          Range("k6", Range("k65536").End(xlUp)).Copy
          Sheets(UserForm2.ComboBox1.Text).Select
          Range("h45").Select
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
             :=False, Transpose:=False
          Application.CutCopyMode = False
   End If
 End If
End If
End If
End If
    Sheets("原本").Select
    Range("a1").Select
     Selection.AutoFilter
     Range("J2").Value = ""
     Range("ae6:ae100").Value = ""
End Sub

 としました。これは「原本」で実際にオートフィルタを設定し、期間でフィルタをかけ、
メーカー名でフィルタをかけたとき、Field:=10に「商品名」又は「サンプル名」がないとき
ない項目では、それを選択できなかったからです。ないものにオートフィルタを設定しても
それ以降正常な指示に戻るまで、「マクロは反応しないのでは。」と考えこのように変更しましたが、
私の考え間違っていますか・間違っているのであれば 考えを改め皆様のご指導を実践します。
(どかべん)

 詳細なシート構成がわからないので動作検証はしていませんが、コードの書き方のみ見てみました。
 詳細はともかく、マクロの記録等を使用してマクロを使用し始めたレベルでは、ここまで書ければ
 まぁ順当ではないでしょうか。

 その上で次のステップに行くには下記を気をつけたほうがよいでしょう。
 (1)インデント
 これまでも何度か書かれていますが、インデントがないのでコードが読みずらいです。
 もう一つ気になったのは If 構文の使い方に癖があるようですね。
 Else が必要か、条件による処理の流れが整理できないかを考えられると、すっきりすると思います。

 (2)Select
 ご自身でもパフォーマンスをしきりに気にされていましたが、まず簡単に着手できるのは Select の
 撲滅です。コードもすっきりしますし、処理も早くなりますので一石二鳥ではないでしょうか。

 (3)更に
 上記ができるようになって、更に余力があれば関数やサブルーチンの使い方を覚えたり、
 配列やオブジェクトの利用を考えてみるとよいでしょう。
 同じような処理が何度もされていますが、サブルーチン化できればシンプルにできます。
 フィルタによる処理をしていますが(これはケースバイケースで、有用なことも多いです)、配列や辞書
 を利用することで処理を高速にできる場合もあります。

 一応(1)、(2)に対応したコード例です。ご参考まで。
 (Mook)

 Option Explicit
 '----------------------------------------------
 ' (1)インデントを修正
 ' 最初の部分だけ条件判定を独立化
 '----------------------------------------------
 Private Sub CommandButton11_Click()
    Dim 検索開始日 As String, 検索終了日 As String
    検索開始日 = ">=" & UserForm2.TextBox1.Text
    検索終了日 = "<=" & UserForm2.TextBox2.Text

    If UserForm2.TextBox1.Text = "" Then
        MsgBox "検索開始日を記入してください。"
        Exit Sub '★ 結局ここで引っ掛かれば処理をしないので終了
    End If

    If UserForm2.TextBox2.Text = "" Then
        MsgBox "検索終了日を記入してください。"
        Exit Sub '★ 結局ここで引っ掛かれば処理をしないので終了
    End If

    If UserForm2.ComboBox1.Text = "" Then
        MsgBox "メーカーを選んでください。"
        Exit Sub '★ 結局ここで引っ掛かれば処理をしないので終了
    End If

    '★ 上記の3条件をクリアした場合のみ下記が実行される。
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7:f35,h7:h35,a45:f54,h45:h54").ClearContents

    Sheets("原本").Select
    Range("ae7:ae100").ClearContents
    Range("A5").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
       Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Range("J6", Range("J65536").End(xlUp)).Select
    Selection.Copy
    Range("ae7").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
       :=False, Transpose:=False
    Application.CutCopyMode = False
    Range("ae6").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R[1]C:R[100]C,""商品名"")"
    Range("ae6").Select
    Selection.Copy
    Range("J2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
       :=False, Transpose:=False
    Range("J2").Select

    If Range("J2").Value = 0 Then
        Sheets("原本").Select
        Range("A1").Select
    Else
        If Range("J2").Value >= 1 Then
            Selection.AutoFilter Field:=10, Criteria1:="商品名"
            Range("C6", Range("h65536").End(xlUp)).Copy
            Sheets(UserForm2.ComboBox1.Text).Select
            Range("A7").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            Sheets("原本").Select
            Application.CutCopyMode = False
            Range("k6", Range("k65536").End(xlUp)).Copy
            Sheets(UserForm2.ComboBox1.Text).Select
            Range("h7").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
               :=False, Transpose:=False
        End If
    End If

    Sheets("原本").Select
    Range("ae7:ae100").ClearContents
    Range("A5").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Range("J6", Range("J65536").End(xlUp)).Select
    Selection.Copy
    Range("ae7").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("ae6").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R[1]C:R[100]C,""サンプル名"")"
    Range("ae6").Select
    Selection.Copy
    Range("J2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Range("J2").Select

    If .Range("J2").Value >= 1 Then
        .Range("J2").AutoFilter Field:=10, Criteria1:="サンプル名"
        .Range("C6", Range("h65536").End(xlUp)).Copy
        Sheets(UserForm2.ComboBox1.Text).Range("A45").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Sheets("原本").Select
        Application.CutCopyMode = False
        Range("k6", Range("k65536").End(xlUp)).Copy
        Sheets(UserForm2.ComboBox1.Text).Select
        Range("h45").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
    End If

    Sheets("原本").Select
    Range("a1").Select
    Selection.AutoFilter
    Range("J2").Value = ""
    Range("ae6:ae100").Value = ""
 End Sub

 '----------------------------------------------
 ' (2) Select を使用しないように変更
 '----------------------------------------------
 Private Sub CommandButton2_Click()
    Dim 検索開始日 As String, 検索終了日 As String
    検索開始日 = ">=" & UserForm2.TextBox1.Text
    検索終了日 = "<=" & UserForm2.TextBox2.Text

    If UserForm2.TextBox1.Text = "" Then
        MsgBox "検索開始日を記入してください。"
        Exit Sub
    End If

    If UserForm2.TextBox2.Text = "" Then
        MsgBox "検索終了日を記入してください。"
        Exit Sub
    End If

    If UserForm2.ComboBox1.Text = "" Then
        MsgBox "メーカーを選んでください。"
        Exit Sub
    End If

    '★ 全体の Select を廃止
    Sheets(UserForm2.ComboBox1.Text).Range("A7:f35,h7:h35,a45:f54,h45:h54").ClearContents

    With Sheets("原本")
        .Range("ae7:ae100").ClearContents
        .Range("A5").AutoFilter
        .Range("A5").AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, Criteria2:=検索終了日
        .AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
        .Range("J6", Range("J65536").End(xlUp)).Copy
        .Range("ae7").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
        .Range("ae6").FormulaR1C1 = "=COUNTIF(R[1]C:R[100]C,""商品名"")"
        .Range("ae6").Copy
        .Range("J2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

        '★ If Range("J2").Value=0 は何もしていないので丸ごと削除
        If .Range("J2").Value >= 1 Then
            .Range("J2").AutoFilter Field:=10, Criteria1:="商品名"
            .Range("C6", Range("h65536").End(xlUp)).Copy
            Sheets(UserForm2.ComboBox1.Text).Range("A7").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

            Application.CutCopyMode = False
            .Range("k6", Range("k65536").End(xlUp)).Copy
            Sheets(UserForm2.ComboBox1.Text).Range("h7").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        End If

        .Range("ae7:ae100").ClearContents
        .Range("A5").AutoFilter
        .Range("A5").AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, Criteria2:=検索終了日
        .Range("A5").AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
        .Range("J6", Range("J65536").End(xlUp)).Copy
        .Range("ae7").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
        .Range("ae6").FormulaR1C1 = "=COUNTIF(R[1]C:R[100]C,""サンプル名"")"
        .Range("ae6").Copy
        .Range("J2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

        '★ Range("J2").Select // 不要なSelect
        '★ If If Range("J2").Value = 0 Then  は何もしていないので丸ごと削除
        If .Range("J2").Value >= 1 Then
            .Range("J2").AutoFilter Field:=10, Criteria1:="サンプル名"
            .Range("C6", Range("h65536").End(xlUp)).Copy
            Sheets(UserForm2.ComboBox1.Text).Range("A45").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            Application.CutCopyMode = False
            .Range("k6", Range("k65536").End(xlUp)).Copy
            Sheets(UserForm2.ComboBox1.Text).Range("h45").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            Application.CutCopyMode = False
        End If

        Sheets("原本").Range("a1").AutoFilter
        .Range("J2").Value = ""
        .Range("ae6:ae100").Value = ""
    End With
 End Sub


 MOOKさん有難うございました。

 ご指導の内容については、今後マクロ作成において実行してゆきます。

 正常に作動するマクロは、作成できましたが、一つ質問させてください。
 マクロはエクセル上ではできないことでも、コード内で指示すれば実行可能なのでしょうか。
その具体的な内容は一つ前のコーナーで質問したことです。

 Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="商品名"
    Range("C6", Range("h6").End(xlDown)).Select

 の部分で、Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
で検索結果、Field:=10に「商品名」がない場合、データがないにもかかわらず、
Selection.AutoFilter Field:=10, Criteria1:="商品名"
    Range("C6", Range("h6").End(xlDown)).Select
がマクロ上で実行されるのでしょうか?「マクロの実行」でこれはできません。

 「YES」の場合、私の頭は混乱してしまいます。「YES]の場合はその根拠の
説明を、お願いいたします。

 私は、少々(?)頑固なところがありまして、納得できないところは納得できるまで、
追求する性格なもので。
(どかべん)

 先に[1]〜[4]の質問に答えていただけませんか?

 (HANA)

 HANAさんごめんなさい。

 質問にお答えいたします。
 [1]理解できます。
 [2]Range("C6:H10")と同義語と理解しています。
 [3]Range("C6:H6")と同じと理解しています。
 [4]>とはいえ、H6セルが非表示に成ってからは普通に選択出来ないので
   >先に選択しておいて非表示にするか
    >名前ボックスに H6 と入れてジャンプした後操作して下さい。
 の意図していることが、理解できていません。
(どかべん)


 >[4]の意図していることが、理解できていません。
 でしたら、H6セルを選択した状態からデータの抽出を行い
 検索結果が無かった状態にして  Ctrl + ↓ をしてみてください。

 「検索結果が無かった状態にして」というのが分からなければ
 簡単には、▼の中の(オプション)を開いて
 その列にない単語を入れて抽出してください。

 たとえば、↓の様な表であれば
		[A]	[B]
	[1]	品名 ▼	価格 ▼
	[2]	りんご	100
	[3]	りんご	100
	[4]	りんご	100
	[5]		
 A2セルを選択した状態で、A1セルの▼を開き
 (オプション)で [ みかん    ▼][と等しい   ▼]
 の様に指定して抽出します。
 (みかん は当然リストの中にありませんので、手入力です。)
		[A]	[B]
	[1]	品名 ▼	価格 ▼
	[5]
 の様な、抽出結果が無い状態になりますので Ctrl + ↓で
 セルの移動先を確認してください。

 (HANA)	

 「H6セル」と指定があったので理解できなかったのですが、検索状態の項目をのぞいた検索したい
項目の最上段(今回は「j4151」)の空白セルを選択して実行でいいのですね。

 であれば空白セルJ65536を選択します。
(どかべん)

 違います。
 Range("h6").End(xlDown)
 これを手作業で行おうとしています。
 なので「H6セル」と指定しています。
 するとRange("C6", Range("h6").End(xlDown)).Select
 これで選択されるセルがわかります。
 (あん)

 やはり空白セル「H65536]を選択します。
(どかべん)

 となると、
 If .Range("C6", .Range("h6").End(xlDown)).Rows.Count = 1 Then
     .AutoFilter Field:=10, Criteria1:="サンプル名"
 このコードの.Range("C6", .Range("h6").End(xlDown)).Rows.Countの値は?
 (あん)

 .Range("C6", .Range("h6").End(xlDown)).Rows.Count
の手動での設定の仕方が解らないので、その前のコードで、stopをかけ確認 しようとし、

  If .Range("C6", .Range("h6").End(xlDown)).Rows.Count = 1 Then

 から、F8ボタンで確認しましたが、 

 End If

 に飛んでしまい値はわかりません。
(どかべん)


 抽出結果がないとき、
 Ctrl + ↓でH65536を選択したのですから、
 Range("C6", Range("h6").End(xlDown)).Selectは
 Range("C6", "H65536").Select となります。
 [2]と同じですからどのセルが選択されるかわかりますね。
 Range("C6", Range("h6").End(xlDown)).Rows.Countも
 Range("C6", "H65536").Rows.Countとなります。
 (あん)

 素直にアドバイス聴いてほしいなぁ。
>Sub Test()
>Range("C6", Range("h6").End(xlDown)).Select
>End Sub
> 
>このプロシージャを実行したときに
>h6が空白のとき、h6にデータがあるとき、h6:h7にデータがあるとき、
>h6とh10にデータがあるとき、と言う風に、いろんなケースで
>どんな範囲が選択されるか、よく確認してみてください。
>そして、選択されたセル範囲の行数が「0」や「1」になるか、
>自分の目で見てみることです。
 
↑
これ、やっていないようなので。
 
>Field:=10に「商品名」がない場合、データがないにもかかわらず、
>Selection.AutoFilter Field:=10, Criteria1:="商品名"
>    Range("C6", Range("h6").End(xlDown)).Select
>がマクロ上で実行されるのでしょうか?
 
答えはイエス。「商品名」がドロップダウンのリストに表示されていなくても、
ドロップダウンのリストで(オプション)を選んで
「商品名」「に等しい」として「OK」、という操作は可能です。
(みやほりん)(-_∂)b


 デバッグの方法だけ。
 >If .Range("C6", .Range("h6").End(xlDown)).Rows.Count = 1 Then
 >から、F8ボタンで確認しましたが、 
 >End If
 >に飛んでしまい値はわかりません。

 ステップ実行は上から順番に実行されるのではなく、実際に処理されるステップを
 トレースするものです。
 If から End If にとんだということは
  .Range("C6", .Range("h6").End(xlDown)).Rows.Count = 1
 の条件が満たされていないということです。
 中身を確認したい場合はウォッチウィンドウやイミディエイトウィンドウを
 利用して変数を確認するか、If の前の行で
 MsgBox .Range("C6", .Range("h6").End(xlDown)).Rows.Count
 のようにすれば(あるいは Debug.Printで)、確認できます。

 上記に関しては一般的な話なのでわからない言葉があったら、まずはネットで
 調べてみてください。
 (Mook)

 おっと。。。Mookさんと衝突しちゃいましたが。。。スミマセン。

 えっと。。。[4]の結果は
 オートフィルタで抽出結果が無かった場合
 正しく、H6セルを選択して Ctrl + ↓ をしても
 H65536 と、シートの最後のセルに移動して仕舞う事は
 確認してもらえたのですよね。。。

 あんさんが書いて居られる事と重複しますが
 ワークシート上での「H6セルを選択して Ctrl + ↓」の操作を、マクロで書くと
 「Range("h6").End(xlDown)」に成ります。 

 今、作って居られたコードの、抽出有無確認の条件部分の式
 > .Range("C6", Range("h6").End(xlDown)).Rows.Count = 1
 に関して話を進めて居ます。

 抽出結果が無かった場合、Range("h6").End(xlDown) → H65536 です。
 つまり、
   .Range("C6", Range("h6").End(xlDown))
    ↓
   .Range("C6", "H65536") = .Range("C6:H65536")
 の事ですね?

 ここで一寸頭を切り換えて

 例えば Range("A1:B5").Rows.Count は「5」です。
 Rows・・・・行  Count・・・・数
 A1:B5の範囲には、5行あります。なので「5」に成ります。
 A10:D14 の範囲にも、5行有りますから
     Range("A10:D14").Rows.Count も「5」です。

 マクロでメッセージボックスを表示させ
 確認してみて下さい。
    Sub 行数()
        MsgBox Range("A1:B5").Rows.Count
    End Sub
 こんな簡単なコードで良いです。
 Rangeの中を色々変えて、納得出来るまで実行してみて下さい。

 さて、[5]納得して頂けましたか?

 でしたら
 [6] Range("C6:H65536").Rows.Count がどの様な値に成るか分かりますか?

 (HANA)

 あんさんわかりました。

 (みやほりん)(-_∂)bさん、久しぶりのご指摘有難うございます。選択したセルの範囲は「0」や
「1」にはなりません。
 Range("C6", Range("h6").End(xlDown)).Select
 の範囲はRange("c6:h65536")を選択しますから。また、オプションで選択することを気づいていませんでした。

 Mookさん有難うございます。
 言葉に対するネット検索は、答えがわかりますが、疑問の状態に対しては、
適切な質問をしないとなかなか疑問に対する答えが見つかりません。
そのためこのコーナーに頼ってしまいます。その答を、私が理解できていなくても、
再度質問をすれば、お叱りを受けながらも何らかのヒントになるご返事がいただける
からです。

 HANAさん毎度毎度適切なご指導有難うございます。
 今回の返答いただく前いろんな方からもご指導いただき、いろんなことを試してみました。
そこで解ったことは、(みやほりん)(-_∂)bさんに対するご返事に記したとうりです。

 [6]の質問に対する答えです。その値は「65531」です。

 このことから、

 Range("C6", Range("h6").End(xlDown)).Select
     If Selection.Rows.Count = 0 Then   

 検索結果が0のとき上記2行の内どちらかを修正すればよいと想像は付くのですが、この辺が、
マクロ初級者のつらいところです。どのように修正すればよいか全くわかりません。

 (どかべん)

 PC
 こうやってお答えできるのも、HANAさんに教えていただいた、Stop、F8処理が非常に役立っています。


 >こうやってお答えできるのも、HANAさんに教えていただいた、Stop、F8処理が非常に役立っています。
 それも大切ですが、メッセージボックスを表示させて
 値を確認してもらえましたか?

 >[6]の質問に対する答えです。その値は「65531」です。
 ですから、抽出が有ったか無かったかの判定を
 If .Range("C6", Range("h6").End(xlDown)).Rows.Count = 1 Then
 と言うコードでは行えませんね。

 さて、抽出結果が有った場合と無かった場合で
 Ctrl + ↓ で移動するセルが異なっている事に気付きましたか?

 [7]
 抽出結果が無かった時は、シートの一番下のセルまで移動しましたね?
 抽出結果が有った時も、シートの一番下のセルまで移動しますか?

 .Rows.Countで、行数を数えることが出来ます。
 その他、.Row なんてやると そのセルが何行目かが分かります。
 例えば、Range("A10").Row とやると「10」になります。
 ですから

    Sub 移動したセルの行()
        MsgBox Range("h6").End(xlDown).Row
    End Sub
 と言うマクロを

 [8]
 抽出結果が有る状態で実行
 抽出条件を少し変えて実行
 抽出結果が無い状態で実行
 して、戻り値を確認してみてください。

 シートの状態がどうなっている時に
 Range("h6").End(xlDown).Row はそれぞれどうなりますか?

 (HANA)

 HANAさんの質問にお答えいたします。

 [7]抽出結果がない場合はC列からH列の可視範囲の最上列からそれの最下列(65536)を選択し、
データがある場合はCからH列の可視範囲が選択されます。

 [8]a)抽出結果ありのとき      505
  b)抽出条件を少し変えたとき   499
  c)抽出結果なしのの時    65536

 マクロの途中上記コード指定時はそれぞれ可視最上列(結果ありの場合485列、なしの場合4151列)
から上記数値列を選択しています。

 以上です。

 最後に皆様に一言お詫びしなければならないことがあります。それは

 Sub 移動したセルの行()
        MsgBox Range("h6").End(xlDown).Row
    End Sub

 上記のようなコードをいろんな方からご指導いただいていましたが、私の知識のなさから

 MsgBox Range("h6").End(xlDown).Row

 だけを切り取り、コード内のどこかに貼り付け実行するものとばかり勘違いしておりました。
そのため、これが実行できていませんでした。それを今回標準モジュールに貼り付け
その対応エクセル画面でマクロの実行することにきづきました。「今頃なに言ってるんだい。」と
お怒りと思いますがお許しください。
(どかべん)

 少し話が込み入ってきてしまいますが 細かいところを書いてみます。

 >[7]データがある場合はCからH列の可視範囲が選択されます。
 これは、「可視範囲」が選択されている訳では有りません。
 試しに選択されている状態でフィルタの絞り込みを解除してみて下さい。
 抽出されている最後の行より上側のセルは全て選択されていますね?・・・・[7−1]

 それから、もう一度絞り込みを行って選択した後
  Ctrl + G → セル選択(S)   ●可視セル(Y)
 をやってから、フィルタの絞り込みを解除してみて下さい。
 抽出されていたセルだけが選択されていますね?・・・・・・・・・・・・・[7−2]

 この[7−2]の状態が「可視範囲が選択」されている状態です。
 絞り込みが行われている状態では、見た目はどちらも同じですが。

 関連として、ついでに確認ですが
 [7−3] 
  マクロでは End(xlDown) と書くと、シート上で Ctrl + ↓ のキー操作と
  同じ様な動きをすることは、ご理解頂けていますか?
  納得出来なければ、マクロの記録をとってみて下さい。同じコードが記録されますので。
 [7−4]
   ここで、先ほど↑で書いた 「Ctrl + G → セル選択(S)   ●可視セル(Y)」も
  マクロの記録にとって、コードを確認してみて下さい。
   Ctrl + G は、変わりに メニュー・編集(E)→ジャンプ(G) を選んで貰っても良いです。

 ひとまず本題に戻りますが。。。

 >[8]a)抽出結果ありのとき 〜 c)抽出結果なしの時    65536
 つまり、Range("h6").End(xlDown).Row が65536だった時は、抽出結果が無いのですよね。

 [9]
 抽出結果の有無の確認は Range("h6").End(xlDown).Row が65536かどうか
 を使って出来そうだと思いませんか?

 >上記のようなコードをいろんな方からご指導いただいていましたが
 >コード内のどこかに貼り付け実行
 どうやって調べても良いと思うのですが、私はメッセージボックスが簡単なので良く使って居ます。
 上のコードは単独で実行する物を載せて結果を確認して貰いました。
 それは、単独でどの様に成るのか確認して貰いたかった為です。

 これから先コードを作っていく過程で「一連の処理の中でどうなっているか知りたい」
 と言う事は有ると思います。
 その時は、
  コード内の必要な場所に、知りたい値を表示するメッセージボックスを
  表示させるコードを書き込むことに成ると思います。

 (あん)さんとのお話の中で
  >>このコードの.Range("C6", .Range("h6").End(xlDown)).Rows.Countの値は?
  > 
  > .Range("C6", .Range("h6").End(xlDown)).Rows.Count
  > の手動での設定の仕方が解らないので、その前のコードで、stopをかけ確認 しようとし、
  >  If .Range("C6", .Range("h6").End(xlDown)).Rows.Count = 1 Then
  > から、F8ボタンで確認しましたが、 
  > End If
  > に飛んでしまい値はわかりません。

 なんてやりとりが有りますが、この時に
 「.Range("C6", .Range("h6").End(xlDown)).Rows.Countの値」を知りたいのですから
 If 〜 で分岐して仕舞う前に(一つ上の行に)
     MsgBox .Range("C6", .Range("h6").End(xlDown)).Rows.Count
 を入れて見れば良かったのです。

 すると、どうなっているか確認出来ますよね?

 (HANA)

 HANAさんできました。しかしまだ問題が残りました。長くなりますが、作成したコードを
すべて表示します。

 Option Explicit
 Private Sub CommandButton1_Click()

 Dim 検索開始日 As String, 検索終了日 As String
    検索開始日 = ">=" & UserForm2.TextBox1.Text
    検索終了日 = "<=" & UserForm2.TextBox2.Text

  If UserForm2.TextBox1.Text = "" Then
    MsgBox "検索開始日を記入してください。"
  Else
  If UserForm2.TextBox2.Text = "" Then
    MsgBox "検索終了日を記入してください。"
  Else
  If UserForm2.ComboBox1.Text = "" Then
    MsgBox "メーカーを選んでください。"
  Else
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7:f35").ClearContents
    Range("h7:h35").ClearContents
    Range("a45:f54").ClearContents
    Range("h45:h54").ClearContents
    Sheets("原本").Select
    Range("A5").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="商品名"
    Range("C6", Range("h6").End(xlDown)).Select

 If Range("C6", Range("h6").End(xlDown)).Rows.Count = 65531 Then
    Selection.AutoFilter Field:=10, Criteria1:="サンプル名"
    Range("C6", Range("h6").End(xlDown)).Select
    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("A45").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
     Sheets("原本").Select
    Application.CutCopyMode = False
    Range("k6", Range("k6").End(xlDown)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("h45").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("原本").Select
    Application.CutCopyMode = False

   If Range("C6", Range("h6").End(xlDown)).Rows.Count = 65531 Then
     Range("a1").Select
     Sheets("原本").Select
     Range("a1").Select
     Exit Sub
   End If
    Range("a1").Select
    Sheets("原本").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Range("a1").Select
   Exit Sub
 End If

    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("A7").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
     Sheets("原本").Select
    Application.CutCopyMode = False
    Range("k6", Range("k6").End(xlDown)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("h7").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("a1").Select
    Sheets("原本").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Range("a1").Select
    End If
    End If
    End If

 End Sub

 としたのですが、"商品名"、"サンプル名"双方がないとき"サンプル名"の欄に空欄をすべて貼り付け
フォームを乱してしまいます。双方ないときもコードを作成し「Exit Sab」を設定しないと
いけないのでしょうか?それともほかの方法があるのでしょうか?ちなみに、コードの中で
「End If」の前で「Exit Sub」としているのは同様のことが発生するためです。
(どかべん)

 その前に。。。私は

   [9]
   抽出結果の有無の確認は Range("h6").End(xlDown).Row が65536かどうか
   を使って出来そうだと思いませんか?

 と書いていますが?

 それから、他の部分(7−1〜4)に関しては確認していただけましたか?

 (HANA)

 [7-1〜4]確認しました。End(xlDown)を指示した時、指定範囲にデータがある場合は
CからH列の6〜データのある最下行が選択されており、ない場合は6から65536行が
選択されています。
 であればなぜデータがある場合フィルタをかけた可視範囲だけが指定のシートに
貼り付けられるのですか?私はこれを行うため SpecialCells(xlCellTypeVisible) の
コードがあると理解していましたが、どなたかに今回のコードの中では必要ないと
教えられ、これを入れなくても、選択された可視範囲がコピーされました。

 [9]についてはできそうだと思い、コードを修正しました。
 (どかべん)

 Selection.PasteSpecialがいくつかありますが、抽出結果が無いときにも
 実行されてしまう箇所はどこですか。
 (あん)

 >であればなぜデータがある場合フィルタをかけた可視範囲だけが指定のシートに
 >貼り付けられるのですか?

 これは、そういう仕様だからとしか言いようがありません。
 セルに数式が入っていても、オートフィルタの抽出結果をコピーして貼り付けた場合
 勝手に値貼り付けに成りますね?これも仕様だと思います。

 ただし、Vistaを使っておられる方から
 「抽出されてないセルもはりついてしまう」
 という報告がありましたので、念のために
 入れておくのが良いと思います。
   本当に貼りついてしまうのか、その方の操作が違っていたのかは
   定かではありませんが。。。。

 >[9]についてはできそうだと思い、コードを修正しました。
 それは、私の意図したコードとは違います。

 一つステップを戻します。
 [10]
 Range("h6").End(xlDown).Row が65536だった時に
 「65536行目のセルです」とメッセージボックスを表示し
 それ以外の時に何もしないマクロを作成してください。
 マクロ名は「結果確認」にしてください。

 (HANA) 

 [10]作成しました。今回は貼り付けましたが、最初に Range("h6").End(xlDown).Row が出現した
後に MsgBox Range("h6").End(xlDown).Row を書き込みそれ以降のコードを消した新たな
コードを作成するのですか?
(どかべん)


 [10]で作成して貰った分岐してメッセージを出すだけのコードと
 現在作成して、上で載せて居られるコードを組み合わせて
 完成させていければと考えていますので
 [10]のコードをこちらへ載せて下さい。

 条件を満たした時にメッセージボックスを表示するだけのコードを載せて下さい。

 それから現在のコードから
 [11]一回目のコピーを行うべく絞り込みを行う部分
 [12]抽出結果のコピーを行う部分
 を抜き出して再度載せて下さい。

 (HANA)

 [10]のコード 
 Selection.AutoFilter Field:=10, Criteria1:="商品名"
    Range("C6", Range("h6").End(xlDown)).Select
 MsgBox Range("h6").End(xlDown).Row
   If Range("C6", Range("h6").End(xlDown)).Rows.Count = 65531 Then

 [11]Selection.AutoFilter Field:=10, Criteria1:="商品名"
    Range("C6", Range("h6").End(xlDown)).Select
   If Range("C6", Range("h6").End(xlDown)).Rows.Count = 65531 Then

 [12]Selection.AutoFilter Field:=10, Criteria1:="商品名"
    Range("C6", Range("h6").End(xlDown)).Select
    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("A7").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

   Range("C6", Range("h6").End(xlDown)).Select と Selection.Copyの間に
条件分岐をはさんでいます。

 [10]のコードの意味を、HANAさんのいっている意味と、私が取り違えているかも
知れません。それと上記コードは、HANAさんの指導をヒントに修正したコードを
使用しています。もし正常に作動していないときのコードを必要とされているのなら、
修正して残っていないので、このコーナーにそのときのコード全部を乗せていますので、
それを参照してください。(みやほりんさんとのやりとりの中)
 (どかべん)


 そうですね、こちらの意図が正しく伝わっていない様です。

 まず、現在のコードとは切り離して[10]のコードを作ってください。
 作成するコードは
   「結果確認」と言うマクロ名で
   Range("h6").End(xlDown).Row が65536だった時に
    『65536行目のセルです』とメッセージボックスを表示し
   それ以外の時に何もしない
 マクロです。

 ですからこのコードは Sub 結果確認() で始まるコードに成ります。

 例えば、「メッセージ表示」と言うマクロ名で
 「Hello」とメッセージボックスを表示するコードは
     Sub メッセージ表示()
         MsgBox "Hello"
     End Sub
 の3行に成ります。
 メッセージ表示 と言うマクロを実行すると、Hello と表示されますね?
 [10]では、その様なコードを書いていただく事を期待しています。

 [10]のマクロは Sub〜 から含めて5行のコードに成るはずです。
 何度も書きますが メッセージボックスを表示する【だけ】のコードです。
 載せておられるコードは、
  絞り込みを行い、範囲を選択し、メッセージボックスを表示し、判定
 をしていますね。。。

 私が作って欲しいのは、判定をし、メッセージボックスを表示する コードです。

 [11]に関しては、オートフィルタで絞り込みを行う部分の事です。
 載せておられるコードは
  絞り込みを行い、範囲を選択して、判定
 をしています。

 [11]の所で抜き出して欲しいコードは
 条件で絞り込む部分です。

 選択するとか、判定するとかは不要です。

 そして、[12]の所で抜き出して欲しいのは
 抽出結果をコピーする部分です。
 条件で絞り込む部分は不要です。
  その後ろの、貼り付け部分はあっても良いですが。。。

 それにしても、Field:=10 でしか絞り込みを行わないのですか?
 一回目の絞り込みは Field:=5 と Field:=13 と Field:=10 で
 条件を付けるのではないかと思っていましたが??

 >このコーナーにそのときのコード全部を乗せていますので、
 >それを参照してください。(みやほりんさんとのやりとりの中)
 私が抜き出したのでは意味がないです。
 どかべんさんが該当部分が何処なのか判断し抜き出してください。

 これからやろうとしている事が出来るように成る為には
 それぞれの行が何を指示しているのか、分かっている必要が有ると思います。
 分かって居られるのなら、正確に抜き出せると思います。
 分かって居られないのなら、それぞれの行が何を指示しているのか
 考えてみてください。

 (HANA)

 解りました。答えを出すことだけに集中いたします。今後も質問に対して的外れな答えを
出すかも知れませんが、そのときはご容赦いただき、今回同様ご指摘ご指導をよろしくお願い
いたします。

 今回の私のやり直しを行った答えです。

 [10] 
   Sub 結果確認()
        MsgBox Range("h6").End(xlDown).Row
    End Sub

 [11] 
  Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="商品名"

 [12]
  Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("A7").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

 (どかべん)


 落ち着いて。
 [10]のコードは
 >作成するコードは
 >  「結果確認」と言うマクロ名で
 >  Range("h6").End(xlDown).Row が65536だった時に
 >   『65536行目のセルです』とメッセージボックスを表示し
 >  それ以外の時に何もしない
 >マクロです。
 (semm)


 semmさんが書いて居られることに追加で。。。

 [12]の部分の事ですが、いきなり「Selection.Copy」で始まっています。
 コピーする範囲を指定する必要が有ると思いますが。。。?

 大きな流れとしては
  オートフィルタでデータの絞り込み・コピー
 をマクロで行いたいのですよね?

 もう少し詳しく書くと、現在出来ているその部分のコードは
  所定のシートの所定のセルを選択し、オートフィルタの設定
  3つの条件で絞り込み
  抽出結果の範囲を選択してコピー
  所定のシートの所定のセルを選択し、値貼り付け

 現在、抽出結果が有った時に正しく動くコードから
 その部分を抜き出して貰いたいのですが。(11と12に分けて)

 [11]に関しても、どのシートのどのセルがアクティブの状態でも
 思ったように抽出したい場合は、その3行の上に
    Sheets("原本").Select
    Range("A5").Select
    Selection.AutoFilter
 の3行が必要だ(。。。書いて居られるコードの場合 ですが。。。)
 と言う事は、分かっていますよね?

 そして、この3行が有るのなら、[12]のコードは
 範囲の選択をしてから、「Selection.Copy」をしないと
 思った範囲がコピーされないと思います。

 それは分かっていて、その部分は分かっているから書いてないのか
 その辺りが曖昧で分かっていないから、書いていないのか
 ・・・よく分かりません。
 どちらでしょう?
 もしも、曖昧にしたままに成っていて この辺りもネックに成っている様に思います。

 (HANA)

 解りました。semmさん、HANAさんご指導のことを踏まえて、
再度[10]〜[12]の私の考えた答えを記してみます。

 [10] 
   Sub 結果確認()
       if Range("h6").End(xlDown).Row=65536 then
        MsgBox "65536行目のセルです。"
    End Sub

 [11] 
 With Sheets("型代原本")
   .Select
    Range("A5").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="商品名"

 [12]
 Range("C6", Range("h6").End(xlDown)).Select
 Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("A45").Select

 いかがでしょうか?
 (どかべん) 

 えっと、[10]で載せられたコードは実行できませんね?
 If に対する End If がありませんので。。。

 ただ、大変申し訳ないのですが 私が誘導を間違えました。
 Range("h6").End(xlDown).Row が 65536 の時はコピー処理をせずに
 Range("h6").End(xlDown).Row が 65536 でない時に コピー処理をするのでした。

 ですので本来、[10]のコードは
   Range("h6").End(xlDown).Row が 65536 でない時に
   『65536行目のセルではありません』
   と、メッセージを表示させる必要がありました。

 「等しい時」は「=」で判定、等しくない時は「<>」で判定出来ます。

 もしかして、投稿できる環境はエクセルが使える環境とは違いますか?
 エクセルが使える環境であれば、投稿前に動かして確認してもらえると良いのですが。
 [10]のコードとして書いておられるコードは、VBEで書いたものではないと思います。

 エクセルがある環境におられるなら、是非「でない時に」のコードを作って動かしてみてください。
 エクセルが無い環境におられるなら、もう一度[10]のコードを見直してみてください。

 (HANA)

 私も、End If を入れ忘れているのを、投稿してから気づきました。エクセルを開いていないと
対応できません。今回も私の手抜きです。以後注意いたします。

 [10] 
   Sub 結果確認()
       if Range("h6").End(xlDown).Row<>65536 then
        MsgBox "65536行目のセルです。"
      End If
    End Sub

 でテストを行ったところ"MsgBox"に「65536行目のセルです。」と表示されました。
 (どかべん)


 >エクセルを開いていないと対応できません。

 そちらの環境はどの様な環境でしょう?
  同じPCで、エクセルも使えるし書き込みも出来る
  違うPCだが、どちらも出来る環境に有る
  書き込みは出来るが、エクセルは使えない。
   (例えば、書き込みは自宅、エクセルは職場に有る 等)

 >でテストを行ったところ
 と書いて居られるので、テスト出来る環境には有る様ですが
 コードはベタ打ちをして居られるように思います。

 因みに最後に載せられた[10]のコードのメッセージは
『65536行目のセルではありません』ですね。
 "<>"で判定なので。~~~~~~~~~~~~

 [11]で抜き出して居られるコードですが、それではWith が使ってある意味がないです。
 先にオートフィルタの方の話をする事にします。

 やりたい事は
  オートフィルタで抽出
  抽出結果をコピーし目的の範囲に貼り付け
 です。しかし、
  抽出結果が無かった場合は、コピー・貼り付けの作業が
  希望通り行えないので、その作業をしない事にします。
 ですから、その様なコードを作ります。

 抽出は[11]のコードで出来ます。
 抽出後、コピー・貼り付けは[12]のコードで出来ます。

 抽出結果が有るか無いかは、[10]のコードで確認出来ます。
 抽出作業をした後・・・[11]のコードを実行した後・・・
 Range("h6").End(xlDown).Row の行数を確認して 65536と等しくない場合は
 結果が有る ので コピー・貼り付けの作業・・・[12]のコード・・・を
 実行すれば良いですね?

 [10]のコードの If 〜 の前に、[11]のコードを書いて
 [10]のコードの MsgBox 〜 が書いてある部分に [12]のコードを書く事になります。
 すると、条件が整っている時
    =Range("h6").End(xlDown).Row で最終行まで行かなかった時
    =抽出結果が有った時
 にだけ、[12]のコードが実行される事に成ります。

 (HANA)

 PCの環境は
 >同じPCで、エクセルも使えるし書き込みも出来る
 です。

 囲みのメッセージは間違っていました。

 コード全体の中でWithを使っていたのをそのままコピーしましたので、表示部分だけでは
意味のないものになってしまいました。

 ご指導のコードを作成してみました。

     Sheets("原本").Select
     Range("A5").Select
     Selection.AutoFilter
     Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
         Criteria2:=検索終了日
     Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
     Selection.AutoFilter Field:=10, Criteria1:="商品名"
 If Range("h6").End(xlDown).Row <> 65536 Then
     Range("C6", Range("h6").End(xlDown)).Select
     Selection.Copy
     Sheets(UserForm2.ComboBox1.Text).Select
     Range("A7").Select

 としてみましたが、いかがでしょうか?
 (どかべん)

 >いかがでしょうか?
 と言うか、実際にそれでやってみるとどうなんですか?
 やっぱり駄目だから聞いているのですか?

 また、コードを読んでみるとどうですか?
 どこかに不安が有りますか?

 それにしても、End If が無い様ですが。

 (HANA)

 いろいろテストを行いましたが、どれもエラーが出るので、作成コードを記してみました。
その後、現状あるコードに上記コードを組み込み、その前でStopをかけ上記コードを
テストしたところ「商品名」のデータの有無では正常に作動しました。

 続きのコードはこれから考えて見ます。そのコードとテスト結果をまた報告いたします。
 (どかべん)

 とうとう完成しました。皆さん(特にHANAさんのご指導は感謝しております。)のご指導で
マクロの作動は完璧です。コード自身はまだまだ未熟なものだと思いますが。

 今回作成したコードの全貌を掲載いたします。

 Private Sub CommandButton1_Click()

 Dim 検索開始日 As String, 検索終了日 As String
    検索開始日 = ">=" & UserForm2.TextBox1.Text
    検索終了日 = "<=" & UserForm2.TextBox2.Text

  If UserForm2.TextBox1.Text = "" Then
    MsgBox "検索開始日を記入してください。"
  Else
  If UserForm2.TextBox2.Text = "" Then
    MsgBox "検索終了日を記入してください。"
  Else
  If UserForm2.ComboBox1.Text = "" Then
    MsgBox "メーカーを選んでください。"
  Else
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7:f35, h7:h35,a45:f54,h45:h54").ClearContents

    Sheets("型代原本").Select
    Range("A5").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="本型"
 If Range("h6").End(xlDown).Row <> 65536 Then
     Range("C6", Range("h6").End(xlDown)).Select
     Selection.Copy
     Sheets(UserForm2.ComboBox1.Text).Select
     Range("A7").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
    Range("k6", Range("k6").End(xlDown)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("h7").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("a1").Select
    Sheets("型代原本").Select
     Application.CutCopyMode = False

 End If

    Selection.AutoFilter Field:=10, Criteria1:="見本型"

 If Range("C6").End(xlDown).Row <> 65536 Then
    Range("C6", Range("h6").End(xlDown)).Select
    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("A45").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
    Range("k6", Range("k6").End(xlDown)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
     Range("h45").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("a1").Select
    Sheets("型代原本").Select
     Application.CutCopyMode = False
 End If

     Selection.AutoFilter
     Range("a1").Select

    End If
    End If
    End If

 End Sub

 もし何か指摘点があればご指導願います。

 今回勉強したことを、ご指導いただいた皆様に感謝とご報告の意味をこめて、箇条書きで
記してみます。

 1.セル範囲の選択の仕方でも、マクロでは多種多様な仕方があることを学びました。

 2.条件分岐の仕方で行いたいことをマクロで指示すれば、やらなくてもいいことは
指示しなくてもよい。(私の作成したコードは、行わなくてもよいことを指示していたので
エラーが出ていたところがあったようです。)

 3.マクロとは作成者の指示したとおり忠実に実行するものである。間違った指示をすれば
そのとうりに実行する。

 4.私自身がまだまだ勉強不足で、マクロとは非常に奥深いものである。

 今回は非常に長いスレになりましたが、それにもかかわらず、その都度適切なご助言をいただいた
皆様方に改めて謝意を申し上げます。私自身まだまだマクロに対して、初級者ですが、
ご指導いただいた皆様方と同等の知識を持てるよう、今後も精進いたします。

 また今後初歩的な質問を繰り返すと思いますが、そのとき今回同様適切なご指導のほど
よろしくお願い申し上げます。
 (どかべん)


 >もし何か指摘点があればご指導願います。
 なんて言い出したらキリがないと思いますが。。。

 取りあえず、(キョチャン)さん=(どかべん)さん ですか?
 でしたら、2007でのオートフィルタの挙動をもう一度確認してもらえると良いのですが。
  本当に、絞り込みを行ってコピーををした場合非表示データも貼り付くのか。
  まぁ、あの書き込みも俄には信じがたい内容でしたが。。。

 それから、現在2003以前のエクセルを使用することを前提に作られています。
 2003以前のエクセルでは、シートの最大行が65536行でした。
 なので、
 > If Range("h6").End(xlDown).Row <> 65536 Then
 で判定できるのですが、2007以降はシートの最大行が 65536行でなくなりました。
 これでは、上の様に書いていたのでは、正しい判定が出来ません。

 そこでお伺いしてみます。
 どかべんさんが書いて居られたコードの中からの引用ですが
 Range("k" & Rows.Count)
 これが、どう言ったセルを意味するか分かりますか?

 もう一つ、忘れそうなので先に書いておきますが
 同じ判定をするのに、どうして違うコードにしてありますか?
 If Range("h6").End(xlDown).Row <> 65536 Then
 If Range("C6").End(xlDown).Row <> 65536 Then

 (HANA)

 同一人物です。

 Range("k" & Rows.Count)=K列の行数を数える との理解です

 If Range("h6").End(xlDown).Row <> 65536 Then
 If Range("C6").End(xlDown).Row <> 65536 Then
は 検索範囲がC列からH列までだったので無意識この2種類にしてしまいました。
そのためたまたま結果が同じだったので正常に作動したものの、このあたりの細心の
注意が必要なのですね。

 今疑問に思っていることを一つ。

 If Range("h6").End(xlDown).Row <> 65536 Then

 1.セルH6から下のデータを数えていのに65531ではなく65536なのか?

 2.セルH6から下のデータは1000件近くあるのにAutoFilter Field:=10で検索したデータが
ないときは =65536 とマクロは判定するのか。数学的に判断するとオートフィルタで
検索後の空白行の最初の行数から65536行の行数ではないのか。

 それともう一つ条件分岐のときのマクロが行う判定の仕方について質問がありますがそれは新たな
スレを作成し質問させていただきます。
 (どかべん)


 >同一人物です。
 それは良かったです。

 でしたら、2007での結果はどうでしたか?
 2007でも2003までと同じ挙動をすると思いますが
 2007だけは特別な動きをしますか?

 >このあたりの細心の注意が必要なのですね。
 細心の注意が必要かどうかは分かりませんが。。。
 取り敢えずこの話は、後回しにします。
 何故、私が わざわざ指摘したのかは ちょっと考えてみて下さい。

 >Range("k" & Rows.Count)=K列の行数を数える との理解です
 これは違います。

 >If Range("h6").End(xlDown).Row <> 65536 Then
 >1.セルH6から下のデータを数えているのに・・・
 これも違います。
 その下の疑問も含め

 これまでのやりとりの内[7]〜[8]の部分を探してもう一度読んで下さい。
 そして、ご自身でやってみた結果を思い出してみて下さい。

 「Row」や「Rows」や Rangeがどこに有るのか 「.Count」の有無 等
 細かい事かもしれませんが、それぞれ違いを正しく認識して下さい。

 Range("K1").Rows.Count と
 Rnge("K" & Rows.Count) は違います。
 Range("K1").Row も違いますね。

 Range("C6", Range("h6").End(xlDown)).Rows.Count と
 Range("h6").End(xlDown).Row は違います。

 この辺りを全部同じ物ととらえて居られる様に感じます。

 実際にメッセージボックスを表示させたり、
 Select でどのセル(セル範囲)が選択されるのか
 確認してみて下さい。
  例えば、 Range("A1").Select ・・・・A1セルが選択されます。
            MsgBox Range("A1").Rows.Count
            MsgBox Range("A1").Row 
            Rnge("A" & Rows.Count).Select
            MsgBox Range("A" & Rows.Count).Rows.Count
            MsgBox Range("A" & Rows.Count).Row 
   A1 でなく、A5:D8 の様な範囲だったらどうか。A10:B12 だったら?
   End(xlDown) とやってみるとどうか。
   Range(   ,    )の様に書いていた場合はどうか?

 自分で結果を想像して、その想像が合っているか
 結果が想像出来ない場合は、やってみるとどうなるのか
   そして、実状をどの様に考えるとその結果に成るのか
 ご自身で納得行くまでやってみて下さい。

 本を読んで知識を得ても、必要な時に使えなくては意味が有りません。
 数学の公式集をたくさん読んでも、問題がとける様には成りませんね?
 将棋の強い人がこれまで読んだ本を全て読んだら、それだけで将棋に強くなれるでしょうか?

 面倒に思われるかもしれませんが
 割と基本的な部分ですので、曖昧なままで先に進んでも
 結局同じ場所で行き詰まると思います。
 ですので、まずは ご自身の手を動かし、ご自身の目で確認し
 どういうコードはどういう結果に成るのか、身につけて下さい。
  頭の中に入れるだけではなく。           

 (HANA)

 HANAさん 細かいところ・・・すみません Rngeとなってます。
 (ななし) 

 今日、会社での仕事中ですが時間が取れたのでいろいろとテストをしてみました。

  MsgBox Range("A1").Rows.Count

 では、行数を数え、

 MsgBox Range("A1").Row 

 では、行の位置を表示しました。

 Rnge("K" & Rows.Count)

 は、まだテストを行ってないのでテストしてみます。

 ただ一つ解らないのは、新しいスレを作成した質問をしますと記した質問ですが、以前記した
コードの一節です

 Selection.AutoFilter Field:=10, Criteria1:="本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row

 If 下 = Rows.Count = 0 Then

 に Mgs 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row を条件分岐の前に挿入し
テストを行ったところ、True と表示されました。これは 下 = Rows.Count = 0 の 
0がTrueで、1がFalseと解釈いたしましたがいかがでしょうか。もしそうであれば、数値の取得と
True,Falseの取得方法の違いはどこで見極めたらいいのでしょうか。それと

  Selection.AutoFilter Field:=10, Criteria1:="見本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row

 If 下 = Rows.Count = 0 Then

 の一節に先と同様に MsgBox〜を挿入し確認したところデータがないにかかわらず、
Trueが表示されます。でもこの後のマクロが行う処理はデータがないものとして処理します。
このことについて、まだ私は理解できていません。

 最後になりましたが、私の使用しているPCはすべて2003なので2007についてはわかりません。
2007について記したことがあるのは、2007を使用している人のPCで、共有しているコードが
正常に作動しなかったから質問させていただきました。

 それと、明日から3日間留守にします。ご回答いただいてもすぐに
ご返事できないことをご容赦ください。
(どかべん)


 MsgBox 5=10=0
 はどうなると思いますか。
 まずは実行せず予想を立てます。
 次に実行して結果を見てください。
 (あん)

 あんさん
 まず予想を立てました。

 MsgBox 5=10=0

 5=10 は True と考えました。

 実行しました。答えは True でした。
 (どかべん)


 勘違いしているかも。
 このかっこの中がどうなるか、だったのです。
 If (5 = 10 = 0) = True Then
     MsgBox "結果はTRUEです。"
 Else
     MsgBox "結果はFALSEです。"
 End If
 これは「( ) = True」は必要なくて、
 If 5 = 10 = 0 Then
 と書けます。
 If 下 = Rows.Count = 0 Then
 と同じですね。
 (あん)

 あんさん
 次の質問です。

 Selection.AutoFilter Field:=10, Criteria1:="見本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row

 If 下 = Rows.Count = 0 Then

 の一節に先と同様に MsgBox〜を挿入し確認したところデータがないにかかわらず、
Trueが表示されます。でもこの後のマクロが行う処理はデータがないものとして処理します。
このことについて、まだ私は理解できていません。
 (どかべん)

 多くの疑問を抱えているのは分かっています。
 しかし、私は
 >>面倒に思われるかもしれませんが
 >>割と基本的な部分ですので、曖昧なままで先に進んでも
 >>結局同じ場所で行き詰まると思います。
 結局ここへ戻ってくると思います。

 ななしさんのご指摘通り、
 >>Rnge("A" & Rows.Count).Select
 これは、「a」が抜けていますね。。。

 [1]〜[12]の質問に順番に答えてもらったら
 ちゃんと動くコードが出来たでしょう?

 何故こちらが確認して欲しいと言う事を、順番に確認しないのですか?

 (HANA)


 えっ・・・・?
> 5=10 は True と考えました。
「5と10は等しい」?
 
私のアドバイスにも耳を貸してくれないしなぁ。 
(みやほりん)(-_∂)b

 数か月前に(HANA)さんが↓で
[[20100123101125]]『オートフィルタで検索データの貼り付け』(キョチャン)
 '------
    上 = 6
    左 = 3
    下 = Cells(上, 左).End(xlDown).Row
    If 下 = Rows.Count Then
        MsgBox "抽出データなし。"
    Else
        MsgBox "抽出データあり。"
    End If
 '------
 と書いておられるようですが、これは検討されましたか?

 私には.End(xlDown).Row→.End(xlUp).Rowとすれば見出し行で止まり、理解しやすいと思うのですが、
 なぜ.End(xlDown).Rowにこだわるのかが不思議です・・・ (Hatch)

 一寸イメージしてみてもらいたいのですが。。。

 少し算数が分かる子が居たとします。
 算数を始めたばかりで、あまり良く分かっていません。
 その子の疑問は『1+1+3がどうして5に成るのか?』だったとします。

 では、どの様に考えてどうなるのが妥当だと思うのか聞いてみると
 「1+1=3 のはずだから 3+3=6 に成るはずだ。
  確認のために、電卓で 3+3 をすると 確かに 6 になる」
 と答えました。

 どかべんさんは、
 「おいおい、その前に 1+1 を電卓で計算してみなさい」
 と言いますよね?

 そして、その話が終わる前に
 「この確認中に新たな疑問が・・・」
 と、別の計算に付いて質問されたらどうでしょう?

 全ての計算は、足し算が基本ですから どこかの時点で 1+1=2 と
 正しい知識を身につける必要が有り、それは今だと思いませんか?

 1+1=3 と思っているのですから、他の単純な足し算も
 違うと思っている可能性が有ると思いませんか?
 すると、3つの数の足し算に手を付ける前に
 2つの数の足し算をしっかり物にしておくのが良いと思いませんか?

 前の投稿・・・とは言え名前が違うので推測ですが・・・でも
 沢山の人が「貴方は○○と言っているけど、それは正しいのか?」と
 確認のコメントをしていたと思いますが、それをそのままにして
 結局矢張り、前提が違ってた事が有りますね?

 このスレを最初から読み返してみてください。
 同じ様な事が、色々な人から指摘されていると思います。

 そもそも
 > 今疑問に思っていることを一つ。
 なんて疑問が残らない様に [1]〜[12]の質問とコメントを書いて居ます。

 分かった『つもり』に成っていて、分かってない部分は
 一つずつ分かって行かないと、いつまで経っても分からないままか。。。
 いつかは分かる時が来るかもしれませんが、それまでが非効率的です。

 曖昧な土台の上に、思考を構築するのは とても危険な事です。
 しっかりした家を造る為には、しっかりした土台が必要でしょう。
 色々な疑問は、曖昧な土台の上に立っている為の様に思います。
  勿論、全部が一つの家では無いので それぞれの土台が必要でしょうけど。。。
  あれやこれやに手を付けると、結局どれも不完全なままです。
  一つずつクリアして行きませんか?

 (HANA)

 ご指導有難うございます。

 確かにHANAさんのご指摘の様に基礎的なことを理解していないと、その上に立てた家は
砂上楼閣であり、もろいものになってしまいます。

 そこで 下 = Rows.Count = 0 の数式について質問させていただきます。

 マクロにおいて i=i+1 は成り立つので(変数の定義)1+1=1 も成り立つと思っていました。
ただ 1+1=1 はどのような場合成り立つのでしょうか。この数式がないのであれば、どのような
数式であれば成り立つのでしょうか。またどのようにして見分けるのでしょうか。
 (どかべん)

 > そこで 下 = Rows.Count = 0 の数式について
 以前には「If 下 = Rows.Count Then」と回答が付いたのでしょう?
 後ろの=0を取れば済むことではないのですか? (Hatch)

 VBAでは「=」には、大体3つの意味がありますので注意が必要ですね。

 1.数式の等号の意味。(これは解りますね)

 2.比較演算子としての等号。
    つまり同じかどうかを判定するためのものでIf分岐などで使います。

 3.Letステートメントでの代入記号。
    i=1などのように変数に値を代入する場合に使うもの。

 この3つを区別して考えないと、ただ数学的な意味だけで考えたり、代入の意味と数学的な意味を
 ごっちゃにしてしまうと全然まとまらないと思いますよ。

 (momo)

 Hatchさんそれは解っています。マクロについて理解していないときに作成し正常に作動した
コードがそれでした。以後皆様方に、いろいろご指導いただき「なぜ?」このコードが
正常に作動するのかその原理をお尋ねしているのです。HANAさんがいつもおっしゃっています、
「基礎的なことを理解していないとマクロコードは作成できない。」と。

 momoさん

 >2.比較演算子としての等号。
    つまり同じかどうかを判定するためのものでIf分岐などで使います。

 について、いまいち理解できていません。よろしければ、もう少し詳しくご説明お願いいたします。
 (どかべん)


 たとえばですね

 If A = B Then
 という条件のIf分岐ではAとBが同じかどうかを比較して判定します。
 この場合AとBが同じです。という意味ではなくてAとBが同じかどうか?という問いかけになりますので
 先の1+1=1が成り立つ。という事にはならないですね。
 i=i+1は代入なのでiは今のiに1を足したものをiに入れなさい。という事です。

 If A = B Then
 とした場合、A=Bは比較演算子なので値を返します。
 返す値はTrueかFalseかであってAとBが同じならTrue、違うならFalseという具合です。

 つまり、AとBが同じである。という数学的な結果を意味するわけでもなく

 AにBの値を入れなさいという代入の意味でもなく

 AとBが同じでしょうか?という比較のための記号として「=」を使っているわけです。

 この違いをしっかり理解されておくと良いかな?と感じましたので書かせて頂きました。
 (momo)

 「○だからなのか、それとも○○○教育の弊害か」・・・ (mitsu)

 >Hatchさんそれは解っています。
分かっていないから、未だに[おしえて君]してるんだよね。

 >マクロについて理解していないときに作成し
バレバレな嘘はやめて下さい。
※コード書いた人間が↓の発言しないよね。

 >このコードが正常に作動するのかその原理をお尋ねしているのです。
コードが提示されてるレスで既出。

 >基礎的なことを理解していないとマクロコードは作成できない
その前に、○○語の・・・。

 mitsuさん上記に述べている私の作成したコードは、マクロ入門時参考書を読みあさり、
マクロコードに利用できるだろう、という部分を探して貼り付け作成したコードで
作成しました。それがたまたま正常に作動しただけです。

 範囲の指定にしても、皆様にご指導いただいた、今なら「上」、「下」などを使用した
面倒な決め方をしません。

 本題に戻ります。下 = Rows.Count・・・(1) の式は 「下」は

 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row・・・(2)

 です。 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Rowを書き換えると

 Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row= Rows.Count 

 となりますね. 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row の次に

 HANAさんに教えていただいた
 If 下 = Rows.Count Then
        MsgBox "抽出データなし。"
    Else
        MsgBox "抽出データあり。"
    End If
 を書き込み確認したところ「抽出データあり」と表示されましたこの場合の
式(2)は最下行の位置を指示し式(1)はその行数を数えているのだと思いますが、
なぜIf 下 = Rows.Count Then のコードで データの有無を判定できるのでしょうか?
 (どかべん) 


 >下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Rowを書き換えると
 ではなく
 > If 下 = Rows.Count Then
 を書き換えると、です。
 If Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row = Rows.Count Then
     MsgBox "抽出データなし。"
 Else
     MsgBox "抽出データあり。"
 End If
 > 2.比較演算子としての等号。
 ですね。

 MsgBox Rows.Count
 とするとExcel2003では65536が表示されますが、Rows.Countとは何か分かっていますか。 
 (あん)

 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
If 下 = Rows.Count Then
この2行を書き換えると
If Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row = Rows.Count Then となります。
 
Rows.Countは「ワークシートの行数」をカウントしています。
Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Rowとはまったく関係ないものをカウントしています。
Excel2003では必ず「65536」です。
(Excel2003限定のマクロならRows.Countの替わりに65536にしておいても良い)
 
Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row は
「Cells(上, 左)の位置からCtrl+↓でジャンプできるセルの行番号」です。
つまり、If 下 = Rows.Count Then を日本語でかくとするならば、
「もし、Cells(上, 左)の位置からCtrl+↓でジャンプしたセルの行番号が65536だったら、Then以下の処理をしなさい」
 
Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row がどんな数値なのか、
つまり、「Cells(上, 左)の位置からCtrl+↓でジャンプしたセルの行番号」がどんな数値に
なるのかということが、ただしく解釈できていないかぎり、「思い込み」でたまたま
動いているコードということです。
 
Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row がどのような数値になるか、列挙します。
 
[65536]
・Cells(上, 左)から下方向に65536行目までデータで埋まっているとき
・Cells(上, 左)にしかデータがなく、それより下がすべて空白のとき
・Cells(上, 左)も含めて下方向がすべて空白のとき
 
[上+1]
・Cells(上, 左)とその次の行にデータがあるとき
・Cells(上, 左)が空白だがその次の行にデータがあるとき
 
[上+n]
・Cells(上, 左)にデータがあり、途中にデータはないが、n行目にデータがあるとき
・Cells(上, 左)からn行目までデータで埋まっているとき
・Cells(上, 左)からn-1行目までデータはないが、n行目にデータがあるとき
 
同じ数字でも、その数字になる条件が一定しません。65536のときに限っても、
データがあるかどうか、これだけをもって判断することはできません。
もしかしたら、
「 Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Rowはフィルタしたあとの行数を数える」
と思い込んでいませんかね?
 
(みやほりん)(-_∂)b

 あんさん、私の下 = Rows.Countの書き換えも間違っているのですか?If 下 = Rows.Count Then
の書き換えはわかります。Rows.Countの意味は解っていませんでした。しかし次の
(みやほりん)(-_∂)bさんの説明で解りました。

 (みやほりん)(-_∂)bさん、ご指摘どうり思い込んでいました。しかし、まだ疑問なことは、
If 下 = Rows.Count Then のコードで以下にデータがあるなしにかかわらず、なぜマクロは
正常に作動するのでしょうか?この点がまだ理解できていません。
 (どかべん)


 >If 下 = Rows.Count Then のコードで以下にデータがあるなしにかかわらず、なぜマクロは
 >正常に作動するのでしょうか?
 に付いては既に確認しましたよね?

 〜〜〜引用 ここから〜〜〜

 [8]
 抽出結果が有る状態で実行
 抽出条件を少し変えて実行
 抽出結果が無い状態で実行
 して、戻り値を確認してみてください。

 シートの状態がどうなっている時に
 Range("h6").End(xlDown).Row はそれぞれどうなりますか?

 (HANA)

 −−−−−−−−−−−−−−−−−−−−−−−−−−−

 HANAさんの質問にお答えいたします。

 [8]a)抽出結果ありのとき      505
  b)抽出条件を少し変えたとき   499
  c)抽出結果なしのの時    65536

 〜〜〜引用 ここまで〜〜〜

 ここの事では無いのですか?

 (HANA)


 HANAさんそのときは Range("h6").End(xlDown).Row で 下 = Rows.Count では
ありませんでした。
 (どかべん)


 こんにちは。佳です。

 どかべんさんがさいごにアップされた(ちゃんと動く)コードの骨格は、こうなっています。
 If 下 <> Rows.Count Then
     'いろいろな作業
 End If

 これは、じつは省略された書き方であって、省略せず全部書くとこうなります。
 If 下 <> Rows.Count Then
     'いろいろな作業
 Else
     'なにもしない
 End If

 Ifは条件分岐です。分岐ですから、条件によって道が分かれないといけません。
 条件に合うときはこっちの道へいく、条件に合わないときは別の道へ行く、です。
 ただ、「条件が成立しない場合はなにもしない」は、わざわざ書くのも煩いので
 たいていは省略して、どかべんさんのかたちで表現します。

 どかべんさんのちゃんと動くコードを、もういちど上のかたちに当てはめてみると、
 If 下 <> Rows.Count Then  '(データのある場合)
     'しかるべき範囲をコピペする
 Else                      '(データのない場合)
     'なにもしない
 End If

 If 下 = Rows.Count Then のコードで以下にデータがあるなしによって、マクロは
 別々の作動します。分かりますか。

 ,
 なお、同じコードを 少し違う書き方にもできます。
 下記のようにコーディングすると、「データのない場合はなにもしない」という意図が
 はっきりと表現できます。

 If 下 = Rows.Count Then  '(データのない場合)
     'なにもしない
 Else                     '(データのある場合)
     'しかるべき範囲をコピペする
 End If


 やはり解りません。

 If 下 = Rows.Count Then  は (みやほりん)(-_∂)bの説明では 「65536」は全くデータがない場合
又はすべてにデータがある場合、「上+n」はCells(上, 左)からn行目までデータがあるとデータの
行数を数えていると解釈できますし、佳さんの説明では、Cells(上, 左)以下のデータの有無を
判断していると解釈します。下 = Rows.Count を私なりに直訳すると「下のコードをを
数えなさい」でそれに対してのどのような判定基準にするのかが見えません(佳さんはデータの
有無を判定基準にされていますが)

 となると条件分岐の下 = Rows.Count は何を判定しているのかわかりません。それともこのコードは
オールマイティなコードですか。そんなコードはないと思いますが。

 もう一つの方法 If Range("C6").End(xlDown).Row <> 65536 Then は「もし("C6")の
最下行の行数を確認しそれが65536と等しくないときは、」とすんなりと頭に入ってきます。
(このコードを直訳してもこのように私でも判断できます。)
 (どかべん)

 こんにちは。
 Range("C6").End(xlDown).Row は、行番号です。行数ではないです。
 Range("C6").End(xlDown)が表すセルの行番号です。

 ■ヘルプより引用
 Row プロパティ
 対象セル範囲の最初の領域の先頭行の番号を返します。値の取得のみ可能です。長整数型 (
Long) の値を使用します。

 −佳−

 Rowプロパティが行番号を返すことは、たとえばこんなコードで確認できます。
 Sub Test()
     MsgBox Selection.Row
 End Sub
 たとえばC27セルを選択してこのコードを実行すると「27」が返ります。

 =====
 > 佳さんの説明では、Cells(上, 左)以下のデータの有無を判断していると解釈します
 そうですね。理論的には、全行がデータで埋まっている場合も考えなければいけませんね。
 ですが、実際のファイルのデータが500件程度しかないなら、そこは考えなくてもまあ問題ないでしょう。

 −佳−

 >下 = Rows.Count を私なりに直訳すると「下のコードをを数えなさい」
  
「Range("C6").End(xlDown).Row <> 65536 」を「("C6")の最下行の行数を確認しそれが65536と等しくないときは、」
と訳すのに(厳密にはその訳し方も違うけれど)、
「下 = Rows.Count 」を「下のコードを数えなさい」と訳すのか、その考え方が理解できない。
「Range("C6").End(xlDown).Row <> 65536 」と同様に
「変数[下]とRows.Countが等しいときは」と訳せばいいんじゃないの?
 
これだけでもどかべんさんの以下の「克服すべき点」が見えてきます。
・Ifステートメント
・変数
・=の働き
・Row、Rowsの違い(区別が付いているとは思えない)
・Countメソッド
・Endプロパティ
 
これらを克服しておかないと、砂上の楼閣どころか、ブラックホール。
(みやほりん)

 >If 下 = Rows.Count Then  は (みやほりん)(-_∂)bの説明では 「65536」は全くデータがない場合
>又はすべてにデータがある場合、「上+n」はCells(上, 左)からn行目までデータがあるとデータの
>行数を数えていると解釈できますし、
 
もしかして「下 = Rows.Count」が「65536」になると思ってないかい??
「下 = Rows.Count」はTrue かFalseにしかなりまへん。
(みやほりん)

 Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row と
 Cells(上, 左).End(xlDown).Row が
 同じものだと分かっていますか?

 上 に「6」 左に「8」が入っている時
 Cells(6, 8).End(xlDown).Row に成って
 Range("h6").End(xlDown).Row と同じですが、分かっていますか?

 〜〜〜引用 ここから〜〜〜

 [9]
 抽出結果の有無の確認は Range("h6").End(xlDown).Row が65536かどうか
 を使って出来そうだと思いませんか?
 (HANA)
 −−−−−−−−−−−−−−−−−−−−−−−−−−−
 [9]についてはできそうだと思い、コードを修正しました。
 (どかべん)

 〜〜〜引用 ここまで〜〜〜

 抽出結果が無かった時は Range("h6").End(xlDown).Row が 65536 に成ります。
 抽出結果があった時は Range("h6").End(xlDown).Row が 65536 以外に成ります。

 ですから、Range("h6").End(xlDown).Row が 65536 以外だった場合にだけ
 コピー処理をすれば良いですね?

 If Range("h6").End(xlDown).Row <> 65536 Then
      ↑の判定で分岐してこの中に入った時だけコピー処理をする
 End If

 上 に「6」 左に「8」が入っている時
 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row と
 下 = Range("h6").End(xlDown).Row は同じです

 そして、2003までの場合  Rows.Count = 65536 です

 If Range("h6").End(xlDown).Row = 65536 Then
 If Range("h6").End(xlDown).Row = Rows.Count Then は分かるのに

 If 下 = 65536 Then 
 If 下 = Rows.Count Then は分からないのですか?

 >>2.比較演算子としての等号。
 >   つまり同じかどうかを判定するためのものでIf分岐などで使います。
 >について、いまいち理解できていません。
 のあとに、(momo)さんが説明を書いてくださっていますが
 理解出来ていますか?

 If 〜 Then の間にある「=」は、判定するための 「=」です。
 もしも単独で 下 = 65536 があれば、これは 下という変数に65536 を代入する「=」ですが。
 「=」はいろいろな意味でつかわれています。
 まずはこの二つの違いをもう一度確認してみられるのが良いと思います。

 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row 
 の「=」は、代入です。

 If 下 = Rows.Count Then
 の「=」は、判定です。

 たとえば、ワークシート上でIF関数を使うときも
 =IF(A1="●",・・・・
 最初の「=」と、二個目の「=」は、意味が違う「=」ですね?

 (HANA)

 佳さん、みやほりんさん、HANAさん有難うございます。

 私の頭の中で現在もやもやしていることに対してお3方ともズバリ答えていただき、かなり
理解でききたのではないかと思っています。(一つだけ佳さんに言い分けさせてください。
今回の質問の中で「もし("C6")の最下行の行数を確認しそれが65536と等しくないときは、」
と書きましたが、佳さんが指摘されるようなことがあってはいけないと思って書いたのですが
「行数」の表現がまずかったようです。「行名」とすべきだったと反省しています。
日本語はマクロコード同様難しい。ただしこのことが言えるのは、今回のみで以前は違います。)

 本題に戻ります。
 > If 下 = Rows.Count Then
 の「=」は、判定です。

 に対してもう一度私なりにおさらいをいたします。

 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row

 に対して

 If 下 = Rows.Count Then

 で「下」の行数を数え、ある場合は「True」と判断し指定範囲をコピーする。ない場合は
「False」でなにもしない。でいいのですね。

 みやほりんさん、
 >これだけでもどかべんさんの以下の「克服すべき点」が見えてきます。
 ・Ifステートメント
 ・変数
 ・=の働き
 ・Row、Rowsの違い(区別が付いているとは思えない)
 ・Countメソッド
 ・Endプロパティ
 全くそのとうりだと思います。しかし、これらの の一部が私には見えてきた様に思います。
それも、このコーナーで皆様方に、ご指導いただいたおかげと思います。
 (どかべん)


 > 「行数」の表現がまずかったようです。「行名」とすべきだったと反省しています。
 くどくて済みませんが「行番号」です。「行名」ではありません。
 行のばあいは、まあ、どちらでもたいして変わりないのですが、列だと、「列番号」は1列目2列目、
 「列名」というとA列B列を指すので。「行番号」という表現にこだわりたいです。

 > で「下」の行数を数え、ある場合は「True」と判断し指定範囲をコピーする。ない場合は
 > 「False」でなにもしない。でいいのですね。

 うーん、ちゃんと分かっていて、日本語の上手下手でこういう表現になっているのか、
 それともやっぱり分かっていないのか、判断しづらいです。

 ちょっとためしにお尋ねしますが 下.Rows.Count はいくらになると思いますか?
 (ちなみに、セル範囲.Rows.Countと書いたら、セル範囲に行が何行あるか、という意味です。
  Range("C3;F5").Rows.Count は、3です。)

 −佳−

 > Range("C3;F5").Rows.Count は、3です。
 われながら良くない例です。
 Range("C3;F7").Rows.Count は 5です、に訂正させて下さい。

 −佳−

 また行数と書いてしまいました。
私なりの正確な書き方をして見ます。

 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row

 に対して

 If 下 = Rows.Count Then

 で行番号を確認し、それが65536と等しくなければ、「True」と判断し指定範囲をコピーする。
65536と等しければ、「False」でなにもしない。

 です。しかし、マクロでは行、列のの呼び方一つにも決まりがあるのですね。
やはり難しい。

 下.Rows.Count については
 Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row .Rows.Count だからこれは
「行数」ですね(これだけでは具体的な行数はわかりませんが)。しかし、自信はありません。

 それと
  > Range("C3;F5").Rows.Count は、3です。
 がなぜよくない例なのですか。
 (どかべん)

 >下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
 >に対して
 >If 下 = Rows.Count Then
 >で行番号を確認し、

 私は行番号がどうこう言う前に、この表現が気になりますけどね。。。

 「に対して」ってどういう事でしょう?
 If 下 = Rows.Count Then は
 下と言う変数に入っているデータ(値)を確認しているに過ぎません。

 その前に、下と言う変数に行番号が入っているので
 If 下 = Rows.Count Then で
 行番号を確認している事に成りますが。

 一行ずつを正確に表現するようにされるのが良いと思います。

 (HANA)

 そのとうりだと思います。ただマクロに対して私は勉強不足のため、まだまだ正確な表現さえ
できていない段階です。「行番号」を正確に表現できなっかたぐらいですから。
この辺の表現方法はどんどん修正して教えてください。

 それと今回の佳さんの逆質問 下.Rows.Count に対する私の答えは間違っていたと
思います。その理由は、基本的なことで、「下」は 検索したデータの最下行をさがしているので
その答えは複数行ではありえないことに気づきました。であれば佳さんの逆質問に対する
答えは「1」でしかないと思います。
 (どかべん)

 こんにちは。佳です。

 > 下.Rows.Count については
 これについてはもうしわけない、私が勘違いしました。
 「下」には行番号が格納されています。行番号.Rows.Countなどとしたら
 エラーになってしまいます。すみませんでした。

 > 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
 > に対して
 > If 下 = Rows.Count Then
 > で行番号を確認し、それが65536と等しくなければ、「True」と判断し指定範囲をコピーする。
 > 65536と等しければ、「False」でなにもしない。

 うんうん、大筋で分かってらっしゃると思います。この2行をさらに正確に表現するなら、
 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
 で行番号を「下」に格納し、もし「下(に格納された行番号)」が65536と等しければ、、、
 (ここまでです。ここからさきのコードは、この2行には含まれていません。)

 > If 下 = Rows.Count Then
 ここですが、「等しければ」ですよ。 下 = Rows.Count ですから。
 「等しくなければ」に相当するコードはここにありません。
 「等しくなければ」という言葉が出てしまったのは、このあとコードに何をさせるか、ご存知だから
 と思われますが、この2行に書いてないことにひきずられて、書いてあることの読み方が
 変わってはいけません。

 本当に表現だけだったのですか?
 これまでのお話からは、そうとは思えませんが。

 >「行番号」を正確に表現できなっかたぐらいですから。
 こちらは、有る程度 表現 の部類に入るとは思いますが。

 全体的に「こういう物だ」と思って居られる事が多い様に思います。
 意味を理解するときは、一行ずつ翻訳して行く様にされると良いと思います。

 > そのとうりだと思います。
 これは、これまでと同じで「読んで分かった【つもり】に成っている」のとは違いますか?

 (HANA)

 佳さん、もう一度コード全体を見直してみました。佳さんがおっしゃるように 
 If 下 = Rows.Count Then の後には、「等しければ」次に行うことを指示していました。

 という解釈でいいのですね。

 HANAさん、辛らつなご意見ですね。「あなたはマクロに対して解ったつもりでいるが、
何もわかっちゃいない。」とおっしゃっていると解釈しますが、受け入れます。
いつもコメントをいただいていますから。しかし、できればあわせて、マクロコードに
対する具体的なご指導もいただけたらありがたいのですが。
 (どかべん)

 >・・・(前略)・・・とおっしゃっていると解釈しますが、受け入れます。
 いや、事実で無いなら受け入れてもらわなくて良いのですが。。。

 >しかし、できればあわせて、マクロコードに
 >対する具体的なご指導もいただけたらありがたいのですが。
 でしたら、その途中で脱線しないでもらいたいのですが?

 これ迄私が確認してもらいたいと言った事をどれだけ確認してもらえましたか?

 答えを見て分かったと思って居られるのでは
 本を見て分かったと思って居られるのと大差ないと思います。

 これまでの事が分かって居られるのなら、私がした質問は
 試すまでもなく簡単に答えられると思います。
 分からなければ、そこは分かったつもりに成っていた点だと思います。

 上を読み返してみて下さい。今なら簡単に分かりますか?

 (HANA)


 もう一度伺います。

  If 下 = Rows.Count Then について 正常に作動するコードで確認しました。

 コードの一節に 
 Selection.AutoFilter Field:=10, Criteria1:="本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
    If 下 = Rows.Count Then
        MsgBox "抽出データなし。"
    Else
        MsgBox "抽出データあり。"
    End If

 Stop
    If 下 = Rows.Count Then

    Selection.AutoFilter Field:=10, Criteria1:="見本型"
    上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End (xlDown).Row                                                                     
 があります。これを実行し"抽出データあり。"のときは If 下 = Rows.Count Then から
 End If に飛んでしまいます。"抽出データなし。"のときは次の行に移ります。
 If 下 = Rows.Count Then を使用しているところではすべて同じ動きをします。

 これらから考えると If 下 = Rows.Count Then は下=65536 のときにしか反応していないように
思えるのですが。それとも、やはり私の頭の悪さで皆様のご説明が理解できていないのでしょうか。

 If 下 = Rows.Count Then で「下」の行番号を確認し、条件分岐、「True」、「False」の判定は
なにを基準にして行っているのでしょうか。
 (どかべん)


 こちらのパソコンで同じ現象を確認できるコードをアップしていただけませんか。
 「コードの一節」と書かれるのではなく、コピペしてそのまま使えるコードをお願いします。
 現在作成されている長いコードは遠慮します。同じシートやフォームを作るのも大変そうです。
 現象の確認だけに使う短いコードを、Sub〜 からEnd Subまで一式、お願いします。

 あ、フィルター関係の部分は要りません。現象と直接関係ありませんから。
 変数も、無理に使わなくていいですが、もし使う場合はちゃんと宣言のコードを書いて下さい。

 −佳−

 解りました。

 If 下 = Rows.Count Then を If 下 = Rows.Count = 0 Then と変えて マクロを実行したところ
正常に作動しました。If 下 = Rows.Count Then では判定をすべて「False」と判定していたようです。
私のマクロコードが正常に作動していたのは、データの有無すべての組み合わせの場合をそれぞれ
書き込み、組み合わせが終了したときにそれぞれ、Exit Sub を行っていたのでたまたま正常に作動
していたものと思われます。

 Selection.AutoFilter Field:=10, Criteria1:="本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
    If 下 = Rows.Count = 0 Then
        右 = 8 '右端検出
    Range(Cells(上, 左), Cells(下, 右)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7").Select
  〜
  〜
 と 

 Selection.AutoFilter Field:=10, Criteria1:="見本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
    If 下 = Rows.Count = 0 Then
        右 = 8 '右端検出
    Range(Cells(上, 左), Cells(下, 右)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7").Select
  〜
  〜

 との組み合わせコードの2つでよくなり、コードの長さも半分にできました。

 もし考え違いがありましたら、ご指摘ください。

 念のため、私がマクロを始めたころの稚拙な恥ずかしいコードですがすべてを記してみます。

 Option Explicit
 Private Sub CommandButton11_Click()
    Dim 列 As Long, 検索開始日 As String, 検索終了日, 上 As Long, 下 As Long, 左 As Long, 右  As Long
    検索開始日 = ">=" & UserForm2.TextBox1.Text
    検索終了日 = "<=" & UserForm2.TextBox2.Text
    If UserForm2.TextBox1.Text = "" Then
    MsgBox "検索開始日を記入してください。"
    Else
    If UserForm2.TextBox2.Text = "" Then
    MsgBox "検索終了日を記入してください。"
    Else
    If UserForm2.ComboBox1.Text = "" Then
    MsgBox "メーカーを選んでください。"
    Else
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7:f35").ClearContents
    Range("h7:h35").ClearContents
    Range("a45:f54").ClearContents
    Range("h45:h54").ClearContents
    Sheets("型代原本").Select
    Range("A5").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row

    If 下 = Rows.Count = 0 Then

    Selection.AutoFilter Field:=10, Criteria1:="見本型"
        上 = 6                                  '基点セルの行番号(この場合はA1の1) ※2
        左 = 3                                  '基点セルの列番号(A1のAの数字表記) ※2
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row       '下端検出
      If 下 = Rows.Count = 0 Then
        Selection.AutoFilter
        Exit Sub
     End If
        右 = 8 '右端検出
    Range(Cells(上, 左), Cells(下, 右)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A45").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
        上 = 6
        左 = 11
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row       '下端検出
        右 = 11 '右端検出
    Range(Cells(上, 左), Cells(下, 右)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("H45").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
      Exit Sub
   End If

        右 = 8
    Range(Cells(上, 左), Cells(下, 右)).Select
    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
    上 = 6
    左 = 11
    下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row       '下端検出
        右 = 11 '右端検出
    Range(Cells(上, 左), Cells(下, 右)).Select  '検出
    Selection.SpecialCells(xlCellTypeVisible).Select
    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("H7").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
    Selection.AutoFilter Field:=10, Criteria1:="見本型"
    上 = 6                                  '基点セルの行番号(この場合はA1の1) ※2
        左 = 3                                  '基点セルの列番号(A1のAの数字表記) ※2
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row       '下端検出
        If 下 = Rows.Count Then

        Selection.AutoFilter
        Exit Sub

    End If
        右 = 8 '右端検出
    Range(Cells(上, 左), Cells(下, 右)).Select  '検出
    Selection.SpecialCells(xlCellTypeVisible).Select
    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A45").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
    上 = 6
    左 = 11
    下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row       '下端検出
        右 = 11 '右端検出
    Range(Cells(上, 左), Cells(下, 右)).Select  '検出
    Selection.SpecialCells(xlCellTypeVisible).Select
    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("H45").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Range("a1").Select
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("a1").Select
    End If
    End If
    End If
    Sheets("型代原本").Select
 End Sub
(どかべん)

 どかべんさん、頭の良し悪しではなく、ほんとにあらゆることをあやふや、
いいかげん、テキトーに覚えていますよ。
> If 下 = Rows.Count Then は下=65536 のときにしか反応していないように
> 思えるのですが。
Selection.AutoFilter Field:=10, Criteria1:="見本型"
が「データがあるときに実行したい」のだったら
二つのIF〜End Ifブロックはこういう関係じゃないの?
 
    If 下 = Rows.Count Then  '(A)
        MsgBox "抽出データなし。" '下 = 65536のときこのメッセージボックスが表示される。
    Else
        MsgBox "抽出データあり。" '下 = 65536でないとき(下 <> 65536のとき)このメッセージボックスが表示される。
    End If
 Stop
    If 下 = Rows.Count Then    '(B)
    '下 = 65536のときここに書いたコードが実行される。
    Else 
    '下 = 65536でないとき(下 <> 65536のとき)ここに書いたコードが実行される。
      Selection.AutoFilter Field:=10, Criteria1:="見本型"
    上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xldown).Row
     ・
     ・
  End If
 
「'下 = 65536のときここに書いたコードが実行される。」
のところに「下 = 65536でないとき」に実行したいコードを書いているのだから、
「下=65536 のときにしか反応していない」になるのは当たり前。
そのように どかべんさんが 書いています。
      ^^^^^^^^^^^^^^
結局、Ifステートメントとか、条件式とか、基本がおさえてないから
思い込みだけの書き方で余分に時間がかかっていると思いませんか?
「Ifの条件式や論理値というものの 理解が不十分、ということがわかります。」
と私が最初に書いてから一ヶ月経過していますから、
そこから一週間でもIFステートメント「だけ」、じっくりやっていたら、
たぶん解決はもっと早かったと考えています。
おそらく、何らかの理由で、私の発言は一ヶ月、無視されていたわけですよね?
いいかげん、頭にきているわけですが。
 
他のスレッドででしたか、「参考本を半日ぐらいで半分読んだ」とアピールされていましたが、
私は「一項目を一週間、繰り返してやってみなさい」というのも多分無視されています。
 
すばらしい成績を残す一流のスポーツ選手は素振りや走り込みなど、基礎練習こそ
大事にしている、というのをご存知ありませんか?
(みやほりん)(-_∂)b

 > 解りました。
 > 念のため、私がマクロを始めたころの稚拙な恥ずかしいコードですがすべてを記してみます。

 あれ? もしかしてこのコードはわたしがお願いしたコードですか?
 違いますよね(笑)。たまたまタイミングが合っただけですね。
 わたしのは「現象の確認だけに使う短いコード」ですもんね。
                     ~~~~     ~~~~~
 −佳−

 やっぱり解っていませんでした。

 みやほりんさん、佳さん、HANAさん有難うございます。ほかいろんな皆さんにその都度書き込み
いただき表面上だけそれに対応していました。だからかなり混乱していたところが合ったようです。
他の方には失礼ですが、しばらくみやほりんさん、佳さん、HANAさんの書き込みに対して、
じっくりと考え実践してみます。そのため皆さんのおっしゃっていることが理解できるまで
この書き込みをしばらく休みます。(いつになるかわかりませんが)しかし、このコーナーの
閲覧だけはさせていただきます。それと一つ教えてください。以前にも一度教えてもらった
ことがあったと思いますが、このコーナーすべての保存の仕方を。すべてをコピーして
エクセルに貼り付ければいいのかもしれませんが、あまりにも長すぎます。

 佳さんごめんなさい。スレを読み返したら「現象の確認だけに使う短いコード」の書き込みが
あったのに気づきましたが、「ときすでに遅し」でした。

 佳さんのおっしゃっている部分と合っているかどうか解りませんが、それを記してみます。

 Option Explicit
Private Sub CommandButton11_Click()
    Dim 列 As Long, 検索開始日 As String, 検索終了日, 上 As Long, 下 As Long, 左 As Long, 右 As Long
    検索開始日 = ">=" & UserForm2.TextBox1.Text
    検索終了日 = "<=" & UserForm2.TextBox2.Text
 Sheets("型代原本").Select
    Range("A5").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row

    If 下 = Rows.Count Then

    Selection.AutoFilter Field:=10, Criteria1:="見本型"
        上 = 6                                  '基点セルの行番号(この場合はA1の1) ※2
        左 = 3                                  '基点セルの列番号(A1のAの数字表記) ※2
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row       '下端検出
      If 下 = Rows.Count Then
        Selection.AutoFilter
        Exit Sub
     End If
 End Sub
 (どかべん)


 どかべんさんは
  これまでの疑問は解決して、これは新たな疑問だから
  良く分からないから質問しよう
 と思って居られるのかも知れませんが
 本質的には同じ質問です。

 まずは、これまでのやりとりを読み返して
 ご自身が分かっていない部分が何処なのか
 ご自身で分かるようにしてみてはどうでしょう?

 何度も分かっていないコードの部分を載せておられますが
 それよりももっと小さく見て、1行で 或いは 1行の内のパーツで
 何処が分かっていないから、全体(載せておられるコードの部分)が分からないのか
 ご自身で見極めてみるのが良いと思います。

 そして、それについて入門書を確認し、今作成中のコードから離れて
 納得がいくまで 簡単な色々なコードを書いて、動かしながら確認し
 身につけるのが良いと思います。
  読んだだけでは駄目ですよ?これまでだって沢山読みましたよね?
  このスレ内だけだって、沢山読んでいると思います。
 ステップインで実行や、値を確認したい時にメッセージボックスで表示させたり
 確認の為の色々な事が出来る様に成りましたよね?

 一つずつご自身で階段を上っていくから、高い壁が乗り越えられます。

 貴方が分かって居ない部分は既に、色々な人から指摘されているのですけどね?

   どうも、「これが分かって無いから、分かりましょう」とこちらが言っても
   それをしっかり分かろうとはなさらない様なので。。。
   でも、やらないといつまで経っても先へは進めませんよ。
   何度質問を繰り返しても、同じ部分が分からないままです。
   だって、質問自体が同じ(所が分かっていない為におきる)質問なのですから。

 >このコーナーすべての保存の仕方を。
「すべて」というのは、どの全てですか?
 貴方が関わったスレの事ですか?

 >すべてをコピーして
 >エクセルに貼り付ければいいのかもしれませんが、あまりにも長すぎます。
 確かに、このスレは長いですが それだけボリュームが有ると思います。

 ですので、御質問が違う事なのでしょうね?
 質問の意図が良く分からないのですが。

 (HANA) 

こんにちは。佳です。

 コメントの入れ違いについては、べつに気にしていません。掲示板ではよくあることです。

 私のほしかったのは、新規ブックにコピペして、それだけで使えるコードです。
 ユーザーフォームを用意したり、シートにデータを入力したりしなくてもそのまま使えるコードです。
 「現象の確認」といったときの「現象」とは、「if文の反応が納得いかない」ってことでしょう。
 ならばその「納得のいかないif文の反応」だけを再現できるコードがほしかったです。
 ひとつにはわたしが楽ってこともありますが、ほんとうのねらいは、そういうコードを作る過程で
 どかべんさんがいろいろ学べることでした。

 書きこみはしばらくお休みされるとのこと。
 ではアップしなくても構いませんから、上記のコードはつくって下さい。

 −佳−

 私が絡んだこのスレ[[20100327171634]] を保存したいのです。以前それを行い、今もそれを
保存しています。そうすれば、保存フォルダ(HTMLドキュメント)から、
直接[[20100327171634]]私の絡んだこのコーナーに入ることができます。それを行いたいのです。
 (どかべん)
 

 IEをお使いですか?
 ファイル→名前を付けて保存でファイルの種類をWebページ完全にしてご自分のPCへ保存したらいかがですか?
 見るときは、ファイル→開くで参照から保存したところから開けばよいと思います。
 依然行った手順がわからなくなったのですか?

 忘れることはよくありますので、重要もしくは忘れたら困ることはメモにでも残されたらいかが?
 このスレのポイントもメモ書きでもされたらもっと理解が早かったかもしれません。
 だって、長いだけで大した内容ではないのですから・・・  (Hatch)

 ここは「エクセルの学校」なので
ここのアドレス
http://www.excel.studio-kazu.jp/kw/20100327171634.html?t=075623
をExcelのセルに貼り付け→F2キー→Enterでハイパーリンク作成
(PON)

 できました。質問ボードの日付を右クリックして保存でした。
 (どかべん)

      下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
    If 下 = Rows.Count Then
       MsgBox "抽出データなし。"
    Else
        MsgBox "抽出データあり。"
    End If

 では"抽出データあり。"が表示され

      下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
    If 下 = Rows.Count Then
       MsgBox "抽出データあり
    Else
        MsgBox 。"抽出データなし。"
    End If

 では 。"抽出データなし。"がデータがあるにかかわらず表示されます。同一箇所で双方
確認しました。ご報告まで。
 (どかべん)


 もう一つ、データのない場所で前記スレと同様のことを行いました。データのないときは
Ifの次の行を選びます。

 それと

 Selection.AutoFilter Field:=10, Criteria1:="本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
 Stop
 If 下 = Rows.Count Then
    Selection.AutoFilter Field:=10, Criteria1:="見本型"

 の箇所では上記位置でStopをかけ「F8」ボタンで確認すると「IF」以下データがあるにかかわらず
End Ifに飛びます。また

  Selection.AutoFilter Field:=10, Criteria1:="見本型"
    上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
 Stop
 If 下 = Rows.Count Then
        Selection.AutoFilter
        Exit Sub
 End If

 のくだりでは、データがないにかかわらず、End If に飛ばないで次の行に移動します。それでも
マクロ全体として正常に作動するのはここで Exit Sub しているからです。

 このことから、Rows.Count について今までご指導いただいていましたが、正常に作動したのは
たまたまで Rows.Count の内容ではなく、使用の仕方が間違っていたと確信いたしました。
その証拠として 「Rows.Count = 0 」と直して使用すると

  下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
    If 下 = Rows.Count = 0 Then
       MsgBox "抽出データなし。"
    Else
        MsgBox "抽出データあり。"
    End If

 も正常に判定いたします。ただ、私の作成したコードを「Rows.Count = 0 」と直しただけでは
全くでたらめな作動をしてしまいます。それは修正し正常な作動するコードになっています。
修正したコードが作成できたのは、ご指導いただいた皆様のおかげと感謝しています。
 (どかべん)


 こんにちは。佳です。

 ■どかべんさんのコメントからの引用
 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
     If 下 = Rows.Count Then
        MsgBox "抽出データなし。"
     Else
         MsgBox "抽出データあり。"
     End If

  では"抽出データあり。"が表示され

       下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
     If 下 = Rows.Count Then
        MsgBox "抽出データあり
     Else
         MsgBox 。"抽出データなし。"
     End If 

 では 。"抽出データなし。"がデータがあるにかかわらず表示されます。同一箇所で双方
 確認しました。
 ■引用終了

 それは、正常な動作です。

 コードの前半を書きかえます。
 下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
     If 下 = Rows.Count Then
        MsgBox "■■■■"
     Else
         MsgBox "●●●●"
     End If
  では"●●●●"が表示され

 つぎは後半のコードを書きかえます。
       下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
     If 下 = Rows.Count Then
        MsgBox "□□□□"
     Else
         MsgBox "○○○○"
     End If
  では 。"○○○○"がデータがあるにかかわらず表示されます。

 要するに、データがあったらElse側を通っているということですね。
 下 = Rows.Count が成り立つのはデータのないときですから、
 データがあったらElse側を通るのは正しいです。

 MsgBoxに、"○○○○"のかわりに「今日は晴れです」と出ても「今日は12月です」と出ても
 そんなのは関係ありません。Else側を通ったときに表示することになっている文字が出るだけです。
 本日の天候とは関係なく、指定したとおりのメッセージが出ます。
 同様に、「データがあります」と出ても、「データがありません」と出ても、それも関係ありません。
 Else側を通ったときに出ることになっている文字がでただけです。

 あとすこしです。がんばって下さい。


 > 修正したコードが作成できたのは、ご指導いただいた皆様のおかげと感謝しています。
 修正したコードをここに貼り付けていただけませんか?
 そうでないと、どのように解決されたのかがこのコメントだけでは全く分かりません。
 よろしくお願いいたします。  (Hatch)

 佳さん、ちょっと待った。

 1. >要するに、データがあったらElse側を通っているということですね。
    >下 = Rows.Count が成り立つのはデータのないときですから、
    >データがあったらElse側を通るのは正しいです

 2.>同様に、「データがあります」と出ても、「データがありません」と出ても、
 それも関係ありません。
   >Else側を通ったときに出ることになっている文字がでただけです。

 私は以前からいっているように、マクロの初級者です。また、単純な人間です、1.の
2行目についてはうすうす感じてはいたのですが、2.について単純な私は表示される
文言をそのまま信じていました。このことについては、もし思い切ってこの書き込みを
していなければ能力のない私のことです、独学では10年たっても解らなかったでしょう。

 Hatchさん、先に大見得をきった私ですので、本当は書くべきではないのですが
今は、気分もスッキリしたので書きます。まだ、稚拙なコードと思いますが、
何かあれば指摘ください。

 Option Explicit
 Private Sub CommandButton1_Click()
    Dim 列 As Long, 検索開始日 As String, 検索終了日, 上 As Long, 下 As Long, 左 As Long, 右 As Long
    検索開始日 = ">=" & UserForm2.TextBox1.Text
    検索終了日 = "<=" & UserForm2.TextBox2.Text
    If UserForm2.TextBox1.Text = "" Then
    MsgBox "検索開始日を記入してください。"
    Else
    If UserForm2.TextBox2.Text = "" Then
    MsgBox "検索終了日を記入してください。"
    Else
    If UserForm2.ComboBox1.Text = "" Then
    MsgBox "メーカーを選んでください。"
    Else
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7:f35").ClearContents
    Range("h7:h35").ClearContents
    Range("a45:f54").ClearContents
    Range("h45:h54").ClearContents
    Sheets("型代原本").Select
    Range("A5").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=5, Criteria1:=検索開始日, Operator:=xlAnd, _
        Criteria2:=検索終了日
    Selection.AutoFilter Field:=13, Criteria1:=UserForm2.ComboBox1.Text
    Selection.AutoFilter Field:=10, Criteria1:="本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
 If 下 = Rows.Count = 0 Then
        右 = 8
    Range(Cells(上, 左), Cells(下, 右)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A7").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
        上 = 6
        左 = 11
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
        右 = 11
    Range(Cells(上, 左), Cells(下, 右)).Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("H7").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
   End If
    Selection.AutoFilter Field:=10, Criteria1:="見本型"
        上 = 6
        左 = 3
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row

 If 下 = Rows.Count = 0 Then
        右 = 8
    Range(Cells(上, 左), Cells(下, 右)).Select
    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("A45").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
        上 = 6
        左 = 11
        下 = Range(Cells(上, 左), Cells(上, 左)).End(xlDown).Row
        右 = 11
    Range(Cells(上, 左), Cells(下, 右)).Select
    Selection.Copy
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("H45").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("型代原本").Select
    Application.CutCopyMode = False
   End If
  End If
  End If
  End If
    Sheets("型代原本").Select
    Selection.AutoFilter
    Range("a1").Select
    Sheets(UserForm2.ComboBox1.Text).Select
    Range("a1").Select
End Sub

 (どかべん) 

 > 佳さん、ちょっと待った。

 おめでとうございます!!
 じゃあ、分かったことを使って、コードを書いて下さい。
 こんどこそ、希望どおりに動くコードが書けるでしょう。
 しかも、もらったコートではありません。自分のことばです。

 −佳−

 修正後のコードを貼り付けていただきましたので、解析してみました。
 オートフィルター部分以降のメモ書きです。
 Sheets("型代原本").Range("A5").AutoFilter
 Fild:=5で>=検索開始日and<=検索終了日 のデータを抽出
 Field:=13でUserForm2.ComboBox1.Text のデータを抽出
 Field:=10で"本型" のデータを抽出

 下=Sheets("型代原本").Range("C6").End(xlDown).Row
 If 下 = Rows.Count = 0 Then 'Trueの時(下<>Rows.Countの時)
    Range("C6:H" & 下).Copy Sheets(UserForm2.ComboBox1.Text).Range("A7")
    下=Sheets("型代原本").Range("K6").End(xlDown).Row
    Range("K6:K" & 下)).Copy Sheets(UserForm2.ComboBox1.Text).Range("H7")
 End If

 Sheets("型代原本").
 Field:=10, Criteria1:="見本型" でデータ抽出
 下 = Range("C6").End(xlDown).Row
 If 下 = Rows.Count = 0 Then 'Trueの時(下<>Rows.Countの時)
    Range("C6:H" & 下).Copy Sheets(UserForm2.ComboBox1.Text).Range("A45")
    下 = Range("K6").End(xlDown).Row 'Cells(6, 11)
    Range("K6:K" & 下).Copy Sheets(UserForm2.ComboBox1.Text).Range("H45")
 End If

 なんか、End Ifが多いような気がしましたが、それは無視して・・・
 以上のようになっているようですので、
 私的には「抽出データがないときは何も処理しない」または、
 「抽出データが有るときだけ処理する」ということで解決されたのだと納得しました。
    (Hatch)

 ■まずは、前回のレスの意図から。・・  (mitsu)

 1'「分かったつもり」は、やめなさい
 2'↓のコードを誰が作成したのか

	'/////
	If 下 = Rows.Count Then
	    MsgBox "抽出データなし。"
    	Else
   	    MsgBox "抽出データあり。"
	End If
 	'/////

 3'↓のスレを読んでないのか
[[20100123101125]]『オートフィルタで検索データの貼り付け』(キョチャン)

 >「下」に入った値がワークシートの最終行数と等しい場合
 >データが無かったと考えてはどうでしょう?

 ■今回

 >・Ifステートメント
 >・変数
 >・=の働き
 >・Row、Rowsの違い(区別が付いているとは思えない)
 >・Countメソッド
 >・Endプロパティ

 上記の指摘に対して

 >全くそのとうりだと思います。

 と、発言されています。

 又、以下の発言もされていますね。

 >いろんな皆さんにその都度書き込みいただき
 >表面上だけそれに対応していました。

 >皆さんのおっしゃっていることが理解できるまで
 >この書き込みをしばらく休みます。

 ★結論を言えば、この内容の無い不毛なやり取りは今すぐやめて
  上記の指摘が理解出来るよう努力する事です。

 「急がば回れ」です!

 ※以下の発言がある箇所で話が脱線しているように感じます。
今後は使用を控え、きちんとレスを読んでコメントするようにして下さい。

 >何かあれば指摘ください。
 >本題に戻ります。

 Hatchさん、再度皆さんのスレを読み返して、Rows.Count =65536 という書き込みがありました。
それを見て「下 = Rows.Count = 0」 は このコードで邪道なコードだと思いました。

 作成したときは「下 = Rows.Count 」を何とか「True」と判定させたいと思い
(下 = Rows.Count )= 0(False)とすれば マクロIf文の中では反転して「True」と
判定すると思い「下 = Rows.Count = 0」と書きました。

 何のことはない、Hatchさんが上記スレで指摘されていますが、「下 <> Rows.Count 」と
すれば、抽出データがある場合は「True」と判定し、抽出データがない場合は「False」と
判定することがわかりました。

 これは、佳さんのご指導の賜物です。
 (どかべん)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.