Excel VBA質問箱 IV

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

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


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

【32091】空白を除いて範囲内でFor seiji 05/12/6(火) 12:55 質問[未読]
【32093】Re:空白を除いて範囲内でFor かみちゃん 05/12/6(火) 13:01 発言[未読]
【32094】Re:空白を除いて範囲内でFor seiji 05/12/6(火) 13:13 発言[未読]
【32096】Re:空白を除いて範囲内でFor かみちゃん 05/12/6(火) 13:16 発言[未読]
【32141】Re:空白を除いて範囲内でFor seiji 05/12/6(火) 22:56 お礼[未読]
【32097】Re:空白を除いて範囲内でFor Kein 05/12/6(火) 13:24 発言[未読]
【32104】Re:空白を除いて範囲内でFor seiji 05/12/6(火) 15:30 質問[未読]
【32105】Re:空白を除いて範囲内でFor seiji 05/12/6(火) 15:35 質問[未読]
【32118】Re:空白を除いて範囲内でFor かみちゃん 05/12/6(火) 16:34 発言[未読]
【32107】Re:空白を除いて範囲内でFor Kein 05/12/6(火) 15:39 発言[未読]
【32127】sheet1として seiji 05/12/6(火) 19:57 質問[未読]
【32128】sheet2として seiji 05/12/6(火) 20:04 質問[未読]
【32130】Re:空白を除いて範囲内でFor かみちゃん 05/12/6(火) 20:13 発言[未読]
【32132】Re:sheet2として Kein 05/12/6(火) 21:09 回答[未読]
【32140】Re: seiji 05/12/6(火) 22:53 お礼[未読]

【32091】空白を除いて範囲内でFor
質問  seiji  - 05/12/6(火) 12:55 -

引用なし
パスワード
   VBAマクロについて


リスト(一覧表)をつくって、vslookup関数を使い、
伝票番号を指定すると 行 のデータだけ表示できるワークシートを準備しました。
伝票番号を1個ずつ指定すればデータを閲覧できるのですが、一覧票は大きくなり
データ数が多く、煩雑になりました。そこで、VBAマクロを利用して
作業をしようと思いました。
伝票番号についてはvslookupの性質上、常に番号順ですので
開始番号と終了番号を指定して、Forでくり返しさせようと試みています。
A1     B1

(伝票番号は、連番で1ずつ増加でつけてあります。)

しかし、リストは、番号順ですが欠番があり空白が存在します。
以下のようなFor文を組むと空白の行に対しても作業を繰り返してしまうので、


Sub 開始終了指定()
開始 = Range("A1").Value
終了 = Range("B1").Value
For a = 開始 To 終了


(1)リストの指定範囲から伝票番号を取得して
(2)指定範囲中の空白行を除いた番号に対してForができるようにしたいのですが

ご指導お願いいたします。

【32093】Re:空白を除いて範囲内でFor
発言  かみちゃん  - 05/12/6(火) 13:01 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>伝票番号についてはvslookupの性質上、常に番号順ですので
>開始番号と終了番号を指定して、Forでくり返しさせようと試みています。

vslookup関数とは何ですか?
ワークシート関数のVLOOKUP関数とは違うのですか?

>(2)指定範囲中の空白行を除いた番号に対してForができるようにしたい

開始と終了が行番号を示していて、伝票番号がA列に入力してある場合
For a = 開始 To 終了
 If Range("A" & a).Value <> "" Then
  〜処理〜
 End If
Next
で、空白以外の場合は、「処理」の部分に書かれたコードが実行されます。

【32094】Re:空白を除いて範囲内でFor
発言  seiji  - 05/12/6(火) 13:13 -

引用なし
パスワード
   VLOOKUPのことです。
タイプミスです。

【32096】Re:空白を除いて範囲内でFor
発言  かみちゃん  - 05/12/6(火) 13:16 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>VLOOKUPのことです。

それはわかりましたが、本題はそこではないかと・・・
For 〜Next の中での条件分岐の仕方を例示しておきましたが、どうだったのでしょうか?

【32097】Re:空白を除いて範囲内でFor
発言  Kein  - 05/12/6(火) 13:24 -

引用なし
パスワード
   問題の表のサンプルと、VLOOKUP数式の具体的なサンプルを提示してみて下さい。

【32104】Re:空白を除いて範囲内でFor
質問  seiji  - 05/12/6(火) 15:30 -

引用なし
パスワード
   ▼Kein さん:
>問題の表のサンプルと、VLOOKUP数式の具体的なサンプルを提示してみて下さい。


    A    B    C    D
1    伝票番号    作業開始    作業終了    
2                
3    顧客名    =VLOOKUP($A$2,A2:D16,2)        
4    所在地    =VLOOKUP($A$2,A2:D16,3)        
5    製品    =VLOOKUP($A$2,A2:D16,4)

【32105】Re:空白を除いて範囲内でFor
質問  seiji  - 05/12/6(火) 15:35 -

引用なし
パスワード
   ▼seiji さん:
>▼Kein さん:
>>問題の表のサンプルと、VLOOKUP数式の具体的なサンプルを提示してみて下さい。
>
>
>    A    B    C    D
>1   伝票番号 作業開始 作業終了    
>2                
>3   顧客名  =VLOOKUP($A$2,A2:D16,2)        
>4   所在地  =VLOOKUP($A$2,A2:D16,3)        
>5   製品   =VLOOKUP($A$2,A2:D16,4)

シートの指定は省きました。
A2に伝票番号を入れると項目がB3、B4、B5に表示されます。
B2とC2に作業開始番号・終了番号を入れておいて、マクロを実行したい。
例えば、印刷作業と考えてください。伝票番号の2から12までを印刷したいとき、
1つずつ伝票番号をA2に入れて、印刷 というのを繰り返さなければならない。
これをForで自動化したいのです。

【32107】Re:空白を除いて範囲内でFor
発言  Kein  - 05/12/6(火) 15:39 -

引用なし
パスワード
   データ元の表があるシートと、抽出するシート(開始番号・終了番号を入力するシート)
は、当然別ですよね ? ならば VLOOKUP数式においても第二引数の "範囲"には
Sheet2! のような、他のシートを参照するための文字がつかないとダメなはずです。
ちゃんとそこまで正確に書いて下さい。

【32118】Re:空白を除いて範囲内でFor
発言  かみちゃん  - 05/12/6(火) 16:34 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>>問題の表のサンプルと、VLOOKUP数式の具体的なサンプルを提示してみて下さい。
>>
>>
>>    A    B    C    D
>>1   伝票番号 作業開始 作業終了    
>>2                
>>3   顧客名  =VLOOKUP($A$2,A2:D16,2)        
>>4   所在地  =VLOOKUP($A$2,A2:D16,3)        
>>5   製品   =VLOOKUP($A$2,A2:D16,4)
>
>シートの指定は省きました。
>A2に伝票番号を入れると項目がB3、B4、B5に表示されます。

伝票番号、顧客名、所在地、製品の一覧は
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=32103;id=excel
で示された表ですか?
この表は、Keinさんもおっしゃっていますが、当然別シートですよね?

>1つずつ伝票番号をA2に入れて、印刷 というのを繰り返さなければならない。
>これをForで自動化したいのです。

最初ご提示されたコード
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=32091;id=excel
と何か全然違うことのようですが、
つまり、For 〜 Next で別シートのA列を検索して、空白以外のセルの値
(5、9、12行目を飛ばして)を順に入力して、「印刷作業」をしていき
たいということでしょうか?

それであれば、VLOOKUPを使うこともないと思うのですが・・・
ただ、「作業開始」と「作業終了」はマクロ開始前に入力しておくという
ことですよね?つまり、各伝票番号共通になるということでしょうか?

【32127】sheet1として
質問  seiji  - 05/12/6(火) 19:57 -

引用なし
パスワード
       A    B    C    D
1    伝票番号    顧客名    所在地    製品名
2    1    **商事    大阪    あ
3    2    **組合    京都    あ
4    3    **会社    神戸    い
5                
6    5    **会社    広島    う
7    6    **協会    福岡    え
8    7    **会社    東京    お
9                
10    9    **組合    東京    か
11    10    **組合    東京    き
12                
13    12    **社    東京    く
14    13    **商会    広島    け
15    14    **商事    福岡    け
16    15    **社    東京    い

【32128】sheet2として
質問  seiji  - 05/12/6(火) 20:04 -

引用なし
パスワード
       A    B    C
1    伝票番号    作業開始伝票番号    作業終了伝票番号
2    5    2    12
3    顧客名    **会社    
4    所在地    広島    
5    製品    う


B3にある数式
=VLOOKUP($A$2,Sheet1!$B$3:$E$17,2)

B4にある数式
=VLOOKUP($A$2,Sheet1!$B$3:$E$17,3)

B5にある数式
=VLOOKUP($A$2,Sheet1!$B$3:$E$17,4)

この場合、A2に5を入れてあります。
問題は、2から開始して12まで作業をしようというときに、
sheet1のA5の伝票番号4、およびA9の8、A12の伝票番号11
が欠けているということ。
これを自動判別して跳ばして、
伝票番号の2,3,5,6,7,9,10,12を作業したいということです。
作業の例は、印刷とお考え下さい。

【32130】Re:空白を除いて範囲内でFor
発言  かみちゃん  - 05/12/6(火) 20:13 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>伝票番号の2,3,5,6,7,9,10,12を作業したいということです。
>作業の例は、印刷とお考え下さい。

[#32093] で、提示した案は、まったく役に立たないということでしょうか?

【32132】Re:sheet2として
回答  Kein  - 05/12/6(火) 21:09 -

引用なし
パスワード
   Sub MyPrint()
  Dim Sh1 As Worksheet, Sh2 As Worksheet
  Dim Snum As Long, Lnum As Long
  Dim Ck As Variant

  Set Sh1 = Worksheets("Sheet1")
  Set Sh2 = Worksheets("Sheet2")
  If WorksheetFunction.Count(Sh2.Range("B1:C1")) < 2 Then GoTo ELine
  Snum = CLng(Sh2.Range("B1").Value)
  Lnum = CLng(Sh2.Range("C1").Value)
  With Application
   If IsError(.Match(Snum, Sh1.Range("A:A"), 0)) Then GoTo ELine
   If IsError(.Match(Lnum, Sh1.Range("A:A"), 0)) Then GoTo ELine
   For i = Snum To Lnum
     Ck = .Match(i, Sh1.Range("A:A"), 0)
     If Not IsError(Ck) Then
      Sh2.Cells(3, 2).Value = Sh1.Cells(Ck, 2).Value
      Sh2.Cells(4, 2).Value = Sh1.Cells(Ck, 3).Value
      Sh2.Cells(5, 2).Value = Sh1.Cells(Ck, 4).Value
      Sh2.Range("A3:B5").PrintOut Copies:=1
     End If
   Next i
  End With
ELine:
  Set Sh1 = Nothing: Set Sh2 = Nothing
End Sub

または

Sub MyPrint2()
  Dim Sh1 As Worksheet, Sh2 As Worksheet
  Dim Snum As Long, Lnum As Long
  Dim Ck1 As Variant, Ck2 As Variant
  Dim MyR As Range, C As Range

  Set Sh1 = Worksheets("Sheet1")
  Set Sh2 = Worksheets("Sheet2")
  If WorksheetFunction.Count(Sh2.Range("B1:C1")) < 2 Then GoTo ELine
  Snum = CLng(Sh2.Range("B1").Value)
  Lnum = CLng(Sh2.Range("C1").Value)
  With Application
   Ck1 = .Match(Snum, Sh1.Range("A:A"), 0)
   Ck2 = .Match(Lnum, Sh1.Range("A:A"), 0))
  End With
  If IsError(Ck1) Or IsError(Ck2) Then GoTo ELine
  On Error GoTo ELine
  Set MyR = Sh1.Range("A" & Ck1 & ":A" & Ck2).SpecialCells(2, 1)
  For Each C In MyR
   With Sh2.Range("B3:B5")
     .Value = WorksheetFunction _
     .Transpose(C.Offset(, 1).Resize(, 3).Value)
     .PrintOut Copies:=1
   End With
  Next
  Set MyR = Nothing
ELine:
  Set Sh1 = Nothing: Set Sh2 = Nothing
End Sub

で、どうでしょーか ?

【32140】Re:
お礼  seiji  - 05/12/6(火) 22:53 -

引用なし
パスワード
   ▼Kein さん:
>で、どうでしょーか ?

ありがとうございます。
まだ不勉強で見たことのないコードがあるので、
ゆっくり本を参考にしながらコードの構造を読み解いてから
試してみます。
ご協力に感謝しています。

【32141】Re:空白を除いて範囲内でFor
お礼  seiji  - 05/12/6(火) 22:56 -

引用なし
パスワード
   ▼かみちゃん さん:
まったく役に立たないなんて、
そんなことないと思います。わたくしが不勉強だったので
気づいていなかったことにおかげで気づけました。ご協力に感謝しています。

>>伝票番号についてはvslookupの性質上、常に番号順ですので
>>開始番号と終了番号を指定して、Forでくり返しさせようと試みています。
>
>vslookup関数とは何ですか?
>ワークシート関数のVLOOKUP関数とは違うのですか?
>
>>(2)指定範囲中の空白行を除いた番号に対してForができるようにしたい
>
>開始と終了が行番号を示していて、伝票番号がA列に入力してある場合
>For a = 開始 To 終了
> If Range("A" & a).Value <> "" Then
>  〜処理〜
> End If
>Next
>で、空白以外の場合は、「処理」の部分に書かれたコードが実行されます。

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