Excel VBA質問箱 IV

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

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


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

【19029】非表示部分の連番の付け方 YN61 04/10/19(火) 19:55 質問[未読]
【19033】Re:非表示部分の連番の付け方 ichinose 04/10/19(火) 23:14 回答[未読]
【19072】Re:非表示部分の連番の付け方 YN61 04/10/20(水) 20:33 お礼[未読]
【19039】Re:非表示部分の連番の付け方 Asaki 04/10/19(火) 23:59 回答[未読]
【19071】Re:非表示部分の連番の付け方 YN61 04/10/20(水) 20:30 質問[未読]
【19122】Re:非表示部分の連番の付け方 Asaki 04/10/22(金) 10:10 回答[未読]
【19133】Re:非表示部分の連番の付け方 bykin 04/10/22(金) 22:35 発言[未読]
【19148】Re:非表示部分の連番の付け方 Asaki 04/10/23(土) 11:40 発言[未読]
【19153】Re:非表示部分の連番の付け方 bykin 04/10/23(土) 19:53 発言[未読]
【19195】Re:非表示部分の連番の付け方 YN61 04/10/24(日) 23:11 お礼[未読]
【19313】Re:非表示部分の連番の付け方 YN61 04/10/28(木) 6:38 質問[未読]
【19347】Re:非表示部分の連番の付け方 bykin 04/10/28(木) 20:04 回答[未読]
【19505】Re:非表示部分の連番の付け方 YN61 04/11/5(金) 21:11 お礼[未読]
【19056】Re:非表示部分の連番の付け方 bykin 04/10/20(水) 12:24 回答[未読]
【19073】Re:非表示部分の連番の付け方 YN61 04/10/20(水) 20:37 お礼[未読]

【19029】非表示部分の連番の付け方
質問  YN61  - 04/10/19(火) 19:55 -

引用なし
パスワード
   行の部分的な非表示の時、表示行にのみ連番をつけ直す方法について教えて下さい。

具体的には

No. 氏名  住所
1   A
2   C
4   E
6   G

3行目と5行目が現在非表示です。

非表示の状態でそのまま、表示されたNo.の行に連番の付け直しをする方法を教えてください。
連番を付け直した結果として下のような状態に仕上げたいのです。

No. 氏名  住所
1  A
2  C
3  E
4  G

最終的にはVBAに反映させたく思います。

【19033】Re:非表示部分の連番の付け方
回答  ichinose  - 04/10/19(火) 23:14 -

引用なし
パスワード
   ▼YN61 さん:
こんばんは。


>行の部分的な非表示の時、表示行にのみ連番をつけ直す方法について教えて下さい。
>
>具体的には
>
>No. 氏名  住所
>1   A
>2   C
>4   E
>6   G
>
>3行目と5行目が現在非表示です。
>
>非表示の状態でそのまま、表示されたNo.の行に連番の付け直しをする方法を教えてください。
>連番を付け直した結果として下のような状態に仕上げたいのです。
>
>No. 氏名  住所
>1  A
>2  C
>3  E
>4  G
>
>最終的にはVBAに反映させたく思います。
ご提示された例のような表を対象として、以下のコードを試してみて下さい。
'============================================================
Sub test()
  Dim wk() As Variant
  Dim carea As Range
  Dim v_area As Areas
  Dim rng As Range
  Set rng = Range("b2", Cells(Rows.Count, 2).End(xlUp))
'   ↑B列を基準にして連番設定セル範囲を取得する
  If rng.Row = 1 Then '何も入力されていない
   Exit Sub
   End If
  With rng.Offset(0, -1)
   If .Count = 1 Then '取得セル範囲が一つだけのとき
    .Value = 1
   Else '複数のセル範囲の場合
    On Error Resume Next
    Set v_area = .SpecialCells(xlCellTypeVisible).Areas
'       ↑ 表示されている範囲をエリアとして取得
    If Err.Number <> 0 Then Exit Sub
    For Each carea In v_area
      If carea.Count > 1 Then '一つのエリア内に複数のセル範囲がある
       Erase wk()
       wk() = carea.Value
       For idx = LBound(wk) To UBound(wk)
         wk(idx, 1) = i + 1
         i = i + 1
         Next idx
       carea.Value = wk()
      Else '一つのエリア内に一つしかセルがない
       carea.Value = i + 1
       i = i + 1
       End If
      Next
    End If
   End With
End Sub

B列(氏名列)の入力されたセル範囲を連番設定対象としています。

【19039】Re:非表示部分の連番の付け方
回答  Asaki  - 04/10/19(火) 23:59 -

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

↓こんな感じでどうでしょうか?
基準はA列にしています。
Sub test()
  Dim i    As Long
  Dim c    As Range
  Dim r    As Range
  Set r = Range(Cells(2, 1), Cells(65536, 1).End(xlUp)).SpecialCells(xlCellTypeVisible)
  If r.Row = 1 Then
    If r.Rows.Count = 1 Then Exit Sub
    Set r = Cells(2, 1)
  End If
  i = 1
  For Each c In r
    c.Value = i
    i = i + 1
  Next c
  Set r = Nothing
End Sub

【19056】Re:非表示部分の連番の付け方
回答  bykin  - 04/10/20(水) 12:24 -

引用なし
パスワード
   こんにちわ。

>最終的にはVBAに反映させたく思います。
ってことやけど、VBA使わん方法考えてみました(^^;;

1.A1を選択した状態から、メニューの[挿入]-[名前]-[定義]で、
  名前:CellHeight
  参照範囲:=GET.CELL(17,A1)
  と設定する。

2.A2に =IF(CellHeight>0,1,0) と入れる。

3.A3に =IF(CellHeight>0,A2+1,A2) と入れ、下までコピーする。

行を削除する可能性があるんやったら、A3〜の数式を
=IF(CellHeight>0,OFFSET(A3,-1,0)+1,OFFSET(A3,-1,0))
としてください。

参考までに、これをVBAに応用すると・・・(名前の定義は事前に設定しておく)

Sub test()
  Dim LastRow As Long
  With ActiveSheet
    LastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
    Select Case LastRow
      Case 2
        .Range("A2").Value = 1
      Case Is > 2
        .Range("A2").Formula = "=IF(CellHeight>0,1,0)"
        .Range(.Cells(3, 1), .Cells(LastRow, 1)).Formula = "=IF(CellHeight>0,A2+1,A2)"
        With .Range(.Cells(2, 1), .Cells(LastRow, 1))
          .Value = .Value
        End With
    End Select
  End With
End Sub

ま、こんな方法もあるってことで・・・
ほな。

【19071】Re:非表示部分の連番の付け方
質問  YN61  - 04/10/20(水) 20:30 -

引用なし
パスワード
   ▼Asaki さん:
こんばんは。
早速ご返事ありがとう御座いました。
いただきました非表示部分の連番が付けられました。→(住所録のNoに使用しました)
例えば、20行の内、3行を非表示にして、連番の打ち直しをすると1〜17まで
綺麗にでました。

その連番を使い、次のようなコードで差込印刷を試みましたが、
非表示部分が、再度出てきます。
どの部分が問題でしょうか。

分かりましたら、教えてください。

Sub 宛名差込印刷()

Dim 番号 As Integer
Dim i As Integer

Worksheets("住所録").Select
   Range("A65536").End(xlUp).Select
   Range(Selection, Selection.End(xlUp).Offset(1, 0)).Select
 i = Selection.SpecialCells(xlCellTypeVisible).Count

Worksheets("宛名印刷").Select
  
For 番号 = 1 To i
    
   Sheets("宛名印刷").Range("E1").Value = 番号
'   Sheets("宛名印刷").PrintOut
  
Next 番号
Range("A1").Select
 
End Sub

【19072】Re:非表示部分の連番の付け方
お礼  YN61  - 04/10/20(水) 20:33 -

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

今晩は。早速ご返事ありがとう御座います。
ご丁寧なコメントまでいただき感謝しています。
今後ともよろしくお願いいたします。

【19073】Re:非表示部分の連番の付け方
お礼  YN61  - 04/10/20(水) 20:37 -

引用なし
パスワード
   ▼bykin さん:
今晩は。凄い回答をいただき、感謝いたします。
関数の使い方にはびっくり致しました。
凄い方法もあるのですね。
未熟な私には、これからの道のりが険しい・・・っと
思いました。
頑張りますので、今後ともよろしくお願いします。
ありがとう御座いました。
随分と時間をかけて作成していただき
本当にありがとう御座いました。

【19122】Re:非表示部分の連番の付け方
回答  Asaki  - 04/10/22(金) 10:10 -

引用なし
パスワード
   >非表示部分が、再度出てきます。
の意味が良く分かりません。
コード中、「差込印刷」と思われるところは見当たりませんが。

【19133】Re:非表示部分の連番の付け方
発言  bykin  - 04/10/22(金) 22:35 -

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

>Asakiはん

たぶん・・・でっけど、YN61はんの宛名印刷シートではVLOOKUP関数を使って
住所録シートのリストから参照させてるんやと思います。
で、VLOOKUPの第一引数(=検索値)が入ってるセルがE1なんやないかな?

E1の数値をインクリメントすることで、リストから順番に表示させて
印刷する・・・ってのをループでやってるんやと思います。

で、この推測が正しいとして・・・
Asakiはんのコードやったら、隠れてるセルの数値をクリアしてへんから
全部?出てくるってことなんかなー?(わからんけど)

Asakiはんのコードの

  Set r = Range(Cells(2, 1), Cells(65536, 1).End(xlUp)).SpecialCells(xlCellTypeVisible)



  With Range(Cells(2, 1), Cells(65536, 1).End(xlUp))
    Set r = .SpecialCells(xlCellTypeVisible)
    .ClearContents
  End With

ってやってみたらどうかな?

ま、あくまで推測でっけど。

>YN61はん

もーちっと詳しい内容をAsakiはんに伝えんと、答え出えへんと思うよ。

ほな。

【19148】Re:非表示部分の連番の付け方
発言  Asaki  - 04/10/23(土) 11:40 -

引用なし
パスワード
   bykin さん、こんにちは。

>たぶん・・・でっけど、YN61はんの宛名印刷シートではVLOOKUP関数を使って
>住所録シートのリストから参照させてるんやと思います。
>で、VLOOKUPの第一引数(=検索値)が入ってるセルがE1なんやないかな?
あ〜、なるほど、そういうことかもしれませんね。

実は理由がよく判ってないのですが、
Secialcells() で可視セル領域だけをループしようと思うと、
For Each 〜 Next は OK なのですが、インデックス(カウンタ)では上手く回らないのです。
セル範囲が飛び飛びになるのが絡んでいるとは思うのですが。。。
(若しくは、指定の仕方が間違っている)

ただ、最初の「可視セルに連番をつける」ことと、
差込印刷がどう関係があるのか、まだ判っていません。
連番をつけるのなら、セルの数を数えてその回数ループするだけで、
ご提示のコードでOKだと思われますが、
bykin さんのご推測のほうがあっている気がしますから、
じゃあ、何故連番なのか??という感じで。

【19153】Re:非表示部分の連番の付け方
発言  bykin  - 04/10/23(土) 19:53 -

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

新潟県のみなさん、大丈夫でっか?
まだ余震があるみたいやから、気ぃつけておくれやす。

>Secialcells() で可視セル領域だけをループしようと思うと、
>For Each 〜 Next は OK なのですが、インデックス(カウンタ)では上手く回らないのです。

こんなんで実験してみると・・・

Sub test()
  Dim i As Long
  Dim r As Range
  Dim rr As Range
  
  Rows("2:4").Hidden = True
  Set rr = Range("A1:A5").SpecialCells(xlCellTypeVisible)
  For Each r In rr
    Debug.Print 1, r.Address
  Next
  Debug.Print "-------------------------"
  For i = 1 To rr.Cells.Count
    Debug.Print 2, rr.Cells(i).Address
  Next
  Debug.Print "-------------------------"
  For i = 1 To 10
    Debug.Print 3, rr.Cells(i).Address
  Next
End Sub

結果は↓こうなります。

1      $A$1
1      $A$5
-------------------------
2      $A$1
2      $A$2
-------------------------
3      $A$1
3      $A$2
3      $A$3
3      $A$4
3      $A$5
3      $A$6
3      $A$7
3      $A$8
3      $A$9
3      $A$10

カウンタを使うと、該当のセル範囲を超えた範囲も参照してまうってことやろね。
ちなみにイミディエイトで
?Range("A1:A2").Cells(10).Address
ってやったら、答えは$A$10で、
?Range("A1:B1").Cells(10).Address
なら、答えは$B$5でした。
Cells(Index)の場合は選択範囲の列幅で下へ、左〜右方向に参照するみたいやね。

?Range("A1:A2").Cells(3,3).Address
のときは$C$3が返るから
Cells(Row,Column)でも、選択範囲を超えて参照するみたいです。

SpecialCellsとかで飛び飛びのセル範囲を取得したときは、For Each を使わんと
思いもせん結果になるから要注意ってことですわなー

>最初の「可視セルに連番をつける」ことと、
>差込印刷がどう関係があるのか、まだ判っていません。

うーん・・・
住所録リストで件数でも確認したいんかな?
ま、こっちで推測しても始まらんけど。

ほな。

【19195】Re:非表示部分の連番の付け方
お礼  YN61  - 04/10/24(日) 23:11 -

引用なし
パスワード
   ▼bykin さん、Asakiさん:

今晩は、色々とご心配をかけています。
本当に失礼しています。

宛名印刷シートはvlookup関数を使っています。
E1のセルを使ってリストを表示させています。
古いリスト(氏名・住所・電話などなど)は一旦非表示にさせて、
表示リストのみを差込印刷の対象にしようと、作り出したのですが
こんなに、皆様にご迷惑をかけてしまい申し訳御座いません。

この下のコードを使って、一度させていただきます。

>たぶん・・・でっけど、YN61はんの宛名印刷シートではVLOOKUP関数を使って
>住所録シートのリストから参照させてるんやと思います。
>で、VLOOKUPの第一引数(=検索値)が入ってるセルがE1なんやないかな?
>
>E1の数値をインクリメントすることで、リストから順番に表示させて
>印刷する・・・ってのをループでやってるんやと思います。
>
>で、この推測が正しいとして・・・
>Asakiはんのコードやったら、隠れてるセルの数値をクリアしてへんから
>全部?出てくるってことなんかなー?(わからんけど)

>Asakiはんのコードの
>
>  Set r = Range(Cells(2, 1), Cells(65536, 1).End(xlUp)).SpecialCells(xlCellTypeVisible)
>
>を
>
>  With Range(Cells(2, 1), Cells(65536, 1).End(xlUp))
>    Set r = .SpecialCells(xlCellTypeVisible)
>    .ClearContents
>  End With
>
>ってやってみたらどうかな?
>
>ま、あくまで推測でっけど。
>
>>YN61はん
>
>もーちっと詳しい内容をAsakiはんに伝えんと、答え出えへんと思うよ。
>ほな。

失礼しました。なかなか表現が難しくって、皆様にご迷惑をかけました
これからもよろしくお願いします。・・・・・・YN61

【19313】Re:非表示部分の連番の付け方
質問  YN61  - 04/10/28(木) 6:38 -

引用なし
パスワード
    Asakiさん, bykinさん

お世話になります。
色々とご指導ありがとう御座いました。

また、頼りない話ですみません。教えていただけませんでしょうか。

実は宛名リストを印刷するに当たり、自分では非表示にして、
連番を付け替え、不要な(非表示行)リストを印刷しない方法を
教えていたき、うまく行きました。本当にありがとう御座いました。

とこが宛名リストを作成して、今ごろになって分かったのですが
「非表示」の処理ではなく、「オートフィルター」で、必要なデータ
を絞りこむ処理をしないと駄目でした。

先日いただいたコードのどの部分を変更すると問題なく動くでしょうか。

時間がありましたら、教えていただけませんでしょうか。

本当に頼りない事で申し訳け御座いません。YN61

【19347】Re:非表示部分の連番の付け方
回答  bykin  - 04/10/28(木) 20:04 -

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

オートフィルタの絞り込みは、どこかの列に○×とか付けてるって
ことなんかな?

まず前提として、「連番の付け直しはしない」ってことに
したほうがええと思います。

1.住所録を全行再表示させて、連番を振りなおす。
2.オートフィルタで印刷対象のデータのみを表示させる。

ここまでは手動でやっておいて・・・

3.宛名印刷用のコードを次のようにする。

Sub 宛名差込印刷()
  Dim Target As Range
  Dim r As Range

  With Worksheets("住所録")
    Set Target = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
    If Target.Row = 2 Then
      With Worksheets("宛名印刷")
        For Each r In Target
          If Not r.EntireRow.Hidden Then
            .Range("E1").Value = r.Value
            .PrintOut
          End If
        Next
      End With
    End If
    Set Target = Nothing
  End With
End Sub

・・・なんてので、ええんとちゃいまっか?

試してみてな。
ほな。

【19505】Re:非表示部分の連番の付け方
お礼  YN61  - 04/11/5(金) 21:11 -

引用なし
パスワード
   ▼bykin さん:
こんばんわ。

大変お世話になりました。
お礼が遅くなり申し訳ありません。

どんくさいものですから、遅々として進みません。
おかげさんで何とかできました。

コードそのものの理解までは行きませんが、少しずつ進めて
行きたいと思っています。

これからもよろしくお願いします。
貴重な時間を割いていただき心より御礼申し上げます。

また分からないことが出てきています。
改めて質問させていただきます。

その折にもよろしくお願いします。

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