Excel VBA質問箱 IV

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

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


1022 / 13645 ツリー ←次へ | 前へ→

【76847】連番設定 gg56 15/3/24(火) 8:20 質問[未読]
【76848】Re:連番設定 β 15/3/24(火) 9:22 発言[未読]
【76850】Re:連番設定 gg56 15/3/24(火) 12:42 お礼[未読]

【76847】連番設定
質問  gg56  - 15/3/24(火) 8:20 -

引用なし
パスワード
   (1)A列にデータが入っています。(ex.A,B,C,D,あるいは空欄)
(2)データは同じ値が連続して入力されていたり、ばらばらになって入力されていたりします。

(希望する動作)同じデータが連続している場合にはB列に1から連番を付ける。
連続したデータが途切れたり、変わったりした場合は次のデータのある行から1から新たに連番を付ける。
(よってデータが不連続な場合は番号は1となります。)

(質問)下のコードで動作はしますが、もっとスマートな書き方はないものでしょうか?
  
Sub Test()
Dim i As Integer
  On Error Resume Next
  For i = 1 To 30 '試しに1〜30行目まで。
   If Cells(i, 1) <> Cells(i + 1, 1) Then 'A列当該行とその直下行のデータが異なっていればB列に1を置く。
    Cells(i + 1, 2) = "1"
   End If
   If Cells(i, 2) = "" And (Cells(i - 1, 2) = "1" Or Cells(i - 1, 2) <> "") Then 'B列当該行=空欄でさらにその直上行=1、または空欄以外の場合
    Cells(i, 2) = Cells(i - 1, 2).Value + 1 'B列当該行に直上行の数値に+1した数値を入力する。
   ElseIf Cells(i, 1) = "" Then 'A列当該行=空欄の場合は空欄とする。  
    Cells(i, 2) = "" 
   End If
  Next i
End Sub

【76848】Re:連番設定
発言  β  - 15/3/24(火) 9:22 -

引用なし
パスワード
   おはようございます。

提示コードは、最初の文字群に番号が振られないというところはありますが
それはさておき。

B1 に =IF(A1="","",1)
B2 に =IF(A2="","",IF(A2=A1,B1+1,1))

この B2 を下にフィルコピー。

これで求める結果がでますね。

この操作をそのままマクロ化して、最後に B列を数式から値変換。
これが1つの方法ですね。

あるいは、上記の数式がやっている判断と処理、これをVBAコード化する手もあります。

Sub Test1()
  
  If Not IsEmpty(Range("A1")) Then
    Range("B1").Value = 1
  Else
    Range("B1").ClearContents
  End If
  
  With Range("A2", Range("A" & Rows.Count).End(xlUp)).Offset(, 1)
    .Formula = "=IF(A2="""","""",IF(A2=A1,B1+1,1))"
    .Value = .Value
  End With
  
End Sub

Sub Test2()
  Dim c As Range
  
  If Not IsEmpty(Range("A1")) Then
    Range("B1").Value = 1
  Else
    Range("B1").ClearContents
  End If
  
  For Each c In Range("A2", Range("A" & Rows.Count).End(xlUp))
    If IsEmpty(c) Then
      c.Offset(, 1).ClearContents
    Else
      If c.Value <> c.Offset(-1).Value Then
        c.Offset(, 1).Value = 1
      Else
        c.Offset(, 1).Value = c.Offset(-1, 1).Value + 1
      End If
    End If
  Next
  
End Sub

【76850】Re:連番設定
お礼  gg56  - 15/3/24(火) 12:42 -

引用なし
パスワード
         βさん
・・・自分のセンスの無さと、頭のカタさを実感しています。
アドバイスに従って下記のように書いてみました。

Sub TestB()
Dim i As Integer
  If Cells(1, 1) = "" Then
   Cells(1, 2) = ""
  Else: Cells(1, 2) = 1
  End If
  For i = 2 To 30
   If Cells(i, 1) = "" Then
    Cells(i, 2) = ""
   ElseIf Cells(i, 1) = Cells(i - 1, 1) Then
    Cells(i, 2) = Cells(i - 1, 2) + 1
   Else: Cells(i, 2) = 1
   End If
  Next i
End Sub

でも、やはり別に提示していただいたサンプルコードのほうが
断然スッキリしていますね。


With Range("A2", Range("A" & Rows.Count).End(xlUp)).Offset(, 1)

で For To Next が不要になるのですね。
勉強になりました。ありがとうございます。

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