[[20101125111420]] 『連続のデータからないものを簡単にみつけたい』(初心者) ページの最後に飛ぶ

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

 

『連続のデータからないものを簡単にみつけたい』(初心者)
 下記のようなデータがあります。
    A      B        C
 1 1111101
 2 1111102
 3 1111103
 4 1111104
   略
  1111124
  1111201
  1111202
   略
  1111224
 A列に7桁のデータがあります
 下2桁は01〜24が入ります。24まで行くと
 下3桁が繰り上がります。
 しかしまれに下2桁がとんでいるところがありそれを探す
 のに苦労しています。
 例えば

   A      B        C

 1 1111101
 2 1111102
 3 1111103
 4 1111105
 5 1111106
 の場合1111104が欠落していますが、データ量が10,0000くらい
 あります。
 今はB列に01〜24のデータを書き、24セル単位で下へ複写し、A列
 の下2桁とにらめっこして確認しています。
 欠落するのは連続で2箇所以上ある場合もあります。

   A      B        C

 1 1111101
 2 1111102     
 3 1111105
 4 1111106
 5 1111107
 この場合1111103と1111104が欠落です。

 こんな場合、一つ上のデータと連続になっていないセルへ色を表示させたり
 欠落しているデータそのものを一覧表示させることは出来るでしょうか。
 もし出来るようならどのようにすればいいかを教えてください。

 


 A2以下の条件付き書式 数式が =RIGHT(A2,2)-RIGHT(A1,2)+(LEFT(A2,5)-LEFT(A1,5))*24>1
 とか

 (momo)


 momoさん。早速のご支援ありがとうございます。
 途中の欠落は色がつくようになりました。しかし下2桁24が欠落している場合
 次のxxxxx01に色がつきません。設定方法が悪いのでしょうか(初心者)


 オートフィルタを使用して…の場合

 B2セルに

 =IF(OR(A2-A1={1,77}),IF(OR(A3-A2={1,77}),"OK","↓欠番"),"↑欠番")

 を入れて下方向へコピペし

 オートフィルタで OK の箇所のチェックを外してエンター…

 すると欠番の箇所だけでるのでは…と思ったんですが、

 1111924 の次は何処の桁が繰り上がるのかな(^^ゞ

 (MJ12)

 ----
B1=IF($A2=IF(MOD(A1+1,100)=25,A1+77,A1+1),"",IF(MOD(A1+1,100) 
 C1:=IF(B1="","",IF($A2=IF(MOD(B1+1,100)=25,B1+77,B1+1),"",IF(MOD(B1+1,100)=25,B1+77,B1+1))) D1:F1まで右へコピー
 B1:F1を下へコピー     欠落5個まで(必要なら右へコピーで増やせる)  (NB)

 ごめん、操作を間違えた様です
 (Bun)


 データはA列に在り、整数値とします
 もし、文字列の場合、多少コードの変更が必要に成ります

 Option Explicit

 Public Sub Sample()

     Dim i As Long
     Dim j As Long
     Dim lngRows As Long
     Dim rngList As Range
     Dim rngResult As Range
     Dim vntData() As Variant
     Dim vntResult() As Variant
     Dim lngTmpF As Long
     Dim lngTmpR As Long
     Dim strProm As String

     'Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置)
     Set rngList = ActiveSheet.Range("A1")

     '結果出力の先頭セル位置を基準とする(先頭列の列見出しのセル位置)
     Set rngResult = ActiveSheet.Range("B1")

     With rngList
         '行数の取得
         lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row + 1
         If lngRows <= 1 And .Value = "" Then
             strProm = "データが有りません"
             GoTo Wayout
         End If
         'A列データを配列に取得
         vntData = .Resize(lngRows + 1).Value
     End With
     '結果出力用配列を確保
     ReDim vntResult(1 To lngRows, 1 To 1)

     '画面更新を停止
     Application.ScreenUpdating = False

     '先頭データを前半5桁と後半2桁に分割(後半部は計算の都合で1少ない値にシフト)
     lngTmpF = (vntData(1, 1) - 1) \ 100
     lngTmpR = (vntData(1, 1) - 1) Mod 100
     'データ2行目〜最終行まで繰り返し
     For i = 2 To lngRows
         '本来在るべき数値を計算
         lngTmpF = lngTmpF + (lngTmpR + 1) \ 24
         lngTmpR = (lngTmpR + 1) Mod 24
         '本来在るべき数値と違う場合、BackColorを変更
         If vntData(i, 1) <> lngTmpF * 100 + lngTmpR + 1 Then
             rngList.Offset(i - 1).Interior.ColorIndex = 36
         End If
         '本来在るべきデータを配列に格納
         Do Until vntData(i, 1) = lngTmpF * 100 + lngTmpR + 1
             j = j + 1
             vntResult(j, 1) = lngTmpF * 100 + lngTmpR + 1
             lngTmpF = lngTmpF + (lngTmpR + 1) \ 24
             lngTmpR = (lngTmpR + 1) Mod 24
         Loop
     Next i

     '抜けのデータをB列に出力
     If j > 0 Then
         rngResult.Resize(j).Value = vntResult
     End If

     strProm = "処理が完了しました"

 Wayout:

     '画面更新を再開
     Application.ScreenUpdating = True

     Set rngList = Nothing
     Set rngResult = Nothing

     MsgBox strProm, vbInformation

 End Sub

 (Bun)



 ん〜そうですか。 私の方では24だけ抜けてもしっかり出来ましたが。
 マクロのサンプルを書いている間にBunさんからの投稿がありましたので
 そちらを参考にされてみてください。
 (momo)

 momoさん。大変失礼しました。再度やってみましたら、momoさんの
 おっしゃる通り色がでました。私のやり方がまずかったです。ごめんなさい。
 MJ12さん。ありがとうございます。現れているデータから見て上が無いのか
 下がないのかがよくわかります。
 Bunさん。ありがとうございます。マクロの中身は正直チンプンカンプンですが
 ’以降の説明まで入れて頂いて今後の勉強に役立てます。
 NBさん。ありがとうございます。欠落しているデータをキーとなるデータの同じ
 行へ横に表示され、他の人への説明資料データとして使用できます。
 しかし、いつも驚いていますが、ひつのの質問に対して、いろんな角度、考え方という
 か、早いと か皆さんすごいですね。本当にありがとうございました。明日会社へ行くの
 が楽しみになりました。 (初心者)


 質問者の初心者です。Bunさんに考えて頂いたマクロですが

   A      B        C

 1 1111101
 2 1111102
 3 1111103
 4 1111104
   略
  1111124
  1111201
  1111202
 とあたかも数値が大きくなっていくパターンではなく下2桁と他の数値はまったく
 別ものの場合があるとわかりました。
   A      B        C
 1 1111101
 2 1111102
 3 1111103
 4 1111104
   略
  1111124
  1111201
  1111202
  1111203
   1111203
  1111203
  1511201
  1511202
   略
  1511224
  1311201
  1311202
   略
  1311224

 うまく説明できませんが、下2桁の01〜24の連続を確認する必要があり
 欠けていデータを確認する必要があります。下2桁01〜24の間は他の151112xx
 131112のところは変わりません。下2桁の01〜24の中でないのを探す(作って
 頂いたマクロのようにB列の上から一覧表させるにはどうすればいいでしょうか


 こんなので善いのかな?

 Option Explicit

 Public Sub Sample_3()

     Dim i As Long
     Dim j As Long
     Dim k As Long
     Dim lngRows As Long
     Dim rngList As Range
     Dim rngResult As Range
     Dim vntData() As Variant
     Dim vntResult() As Variant
     Dim lngTmpF As Long
     Dim lngTmpR As Long
     Dim strProm As String

     'Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置)
     Set rngList = ActiveSheet.Range("A1")

     '結果出力の先頭セル位置を基準とする(先頭列の列見出しのセル位置)
     Set rngResult = ActiveSheet.Range("B1")

     With rngList
         '行数の取得
         lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row + 1
         If lngRows <= 1 And .Value = "" Then
             strProm = "データが有りません"
             GoTo Wayout
         End If
         'A列データを配列に取得
         vntData = .Resize(lngRows + 1).Value
     End With
     '結果出力用配列を確保
     ReDim vntResult(1 To lngRows, 1 To 1)

     '画面更新を停止
     Application.ScreenUpdating = False

     '先頭データの前半5桁
     lngTmpF = (vntData(1, 1)) \ 100
     '後ろ2桁の値の初期値
     lngTmpR = 0
     'データ1行目〜最終行まで繰り返し
     i = 1
     Do Until i > lngRows
         '前5桁が同じなら
         If lngTmpF = vntData(i, 1) \ 100 Then
             '本来在るべき数値と違う場合、BackColorを変更
             If vntData(i, 1) Mod 100 <> lngTmpR + 1 Then
                 rngList.Offset(i - 1).Interior.ColorIndex = 38
             End If
             '本来在るべきデータを配列に格納
             For j = lngTmpR + 1 To (vntData(i, 1) Mod 100) - 1
                 k = k + 1
                 vntResult(k, 1) = lngTmpF * 100 + j
             Next j
             '後半部の値を更新
             lngTmpR = vntData(i, 1) Mod 100
             '行位置を更新
             i = i + 1
         Else
             '前値の前半分が完了していない場合
             For j = lngTmpR + 1 To 24
                 k = k + 1
                 vntResult(k, 1) = lngTmpF * 100 + j
             Next j
             If lngTmpR < 24 Then
                 rngList.Offset(i - 1).Interior.ColorIndex = 38
             End If
             '前半5桁値を更新
             lngTmpF = (vntData(i, 1)) \ 100
             '後ろ2桁の値の初期値
             lngTmpR = 0
         End If
     Loop

     '抜けのデータをB列に出力
     If k > 0 Then
         rngResult.Resize(j).Value = vntResult
     End If

     strProm = "処理が完了しました"

 Wayout:

     '画面更新を再開
     Application.ScreenUpdating = True

     Set rngList = Nothing
     Set rngResult = Nothing

     MsgBox strProm, vbInformation

 End Sub

 (Bun)


 Bunさん。初心者です。なんどもすみません。今きちっとしたデータがないので
 実際のデータが手元になく思い出しながらデータを作って質問をしています。
 明日会社へ行ってかきちっと確認させて頂きます。中途半端で申し訳けありません。
 そしてありがとうございます。

コメント返信:

[ 一覧(最新更新順) ]


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