Excel VBA質問箱 IV

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

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


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

【42532】配列から数値の抜き出し 06/9/13(水) 23:12 質問[未読]
【42534】Re:配列から数値の抜き出し [名前なし] 06/9/14(木) 0:55 発言[未読]

【42532】配列から数値の抜き出し
質問    - 06/9/13(水) 23:12 -

引用なし
パスワード
   こんばんわ。
数値の数が不特定の配列があります。

配列(1)=100
配列(2)=160
配列(3)=161
配列(4)=10
配列(5)=10
   :
   :
配列(n)="" (empty値)

1.この配列をEmptyを無視して小さい順にならびかえて
  配列(1)=10
  配列(2)=10
  配列(3)=100
  配列(4)=160
  配列(5)=161
2.重複する数値は除き、
  配列(1)=10
  配列(2)=100
  配列(3)=160
  配列(4)=161
3.さらに前後の差が1の時は小さいほうのみ残す
  配列(1)=10
  配列(2)=100
  配列(3)=160
にはどうすればよいでしょうか?

【42534】Re:配列から数値の抜き出し
発言  [名前なし]  - 06/9/14(木) 0:55 -

引用なし
パスワード
   手順を変えちゃいましたが、こんな感じでどうでしょうか。

Sub Macro1()
Dim i As Long, j As Long, Tmp As Variant
Dim Min As Long, Max As Long
Dim V As Variant

'----------------------------------------------------------------------------
'テスト用配列生成
  ReDim V(1 To 200)
  Randomize
  
  For i = LBound(V) To UBound(V)
    If i Mod 10 > 0 Then
      V(i) = Int(Rnd() * 200) + 1
    End If
  Next
  
  Range("A1").Resize(UBound(V)).Value = WorksheetFunction.Transpose(V)
'----------------------------------------------------------------------------
'1.並べ替え(挿入ソート)
  Min = LBound(V): Max = UBound(V)
  
  If IsEmpty(V(LBound(V))) Then V(LBound(V)) = "E"
  
  For i = Min + 1 To Max
    For j = i To Min + 1 Step -1
      If IsEmpty(V(j)) Then V(j) = "E"
      If Not (V(j - 1) > V(j)) Then Exit For
      Tmp = V(j): V(j) = V(j - 1): V(j - 1) = Tmp
    Next j
  Next i

  Range("B1").Resize(UBound(V)).Value = WorksheetFunction.Transpose(V)
'----------------------------------------------------------------------------
'2.重複・差が1の値削除
  For i = Max To Min + 1 Step -1
    If V(i) <> "E" Then Exit For
  Next
  
  For j = i To Min + 1 Step -1
    If V(j) - V(j - 1) < 2 Then
      V(j) = "E"
    End If
  Next
  
  Range("C1").Resize(UBound(V)).Value = WorksheetFunction.Transpose(V)
'----------------------------------------------------------------------------
'3.Empty削除
  
  V = Filter(V, "E", False)

  Range("D1").Resize(UBound(V)).Value = WorksheetFunction.Transpose(V)
  
'----------------------------------------------------------------------------
  MsgBox "A列:最初の配列" & vbLf & _
      "B列:並べ替え後" & vbLf & _
      "C列:重複削除後" & vbLf & _
      "D列:Empty削除後"
End Sub

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