過去ログ

                                Page     674
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼EXCELで 表の中の異なる領域 を数える方法  だん 03/1/30(木) 14:35
   ┗Re:EXCELで 表の中の異なる領域 を数える方法  JuJu 03/1/30(木) 18:27
      ┗Re:EXCELで 表の中の異なる領域 を数える方法  だん 03/1/30(木) 21:51
         ┗Re:EXCELで 表の中の異なる領域 を数える...  JuJu 03/2/3(月) 12:40
            ┗Re:EXCELで 表の中の異なる領域 を数える...  だん 03/2/4(火) 17:32

 ───────────────────────────────────────
 ■題名 : EXCELで 表の中の異なる領域 を数える方法
 ■名前 : だん
 ■日付 : 03/1/30(木) 14:35
 -------------------------------------------------------------------------
   EXCELで 表の中の異なる領域 を数える方法

環境: Excel2000(win98se)

タイトルのことを EXCEL VBA をつかってやりたいのですが、
どのようにプログラムを組むとできるのかが
考えつきません。どなたか助けて頂けますか?

下のような 5行*10列 の表に数字が記入されている状態です。

  1234567890
 ------------
1 | 1112111311
2 | 1112211311
3 | 1122211311
4 | 1111111122
5 | 1444441122

# 領域の種類を表す数字: 1,2,3,4

この表を VBA を使って以下のような計算結果を出力するには
どのようにすればよいでしょうか?

領域の種類(数字)別の個数:
 1: 2つ
 2: 2つ
 3: 1つ
 4: 1つ
領域の数の合計: 6つ


よろしくお願いします。


だん
 ───────────────────────────────────────  ■題名 : Re:EXCELで 表の中の異なる領域 を数える方法  ■名前 : JuJu <juju-bbs@su-u.com>  ■日付 : 03/1/30(木) 18:27  -------------------------------------------------------------------------
   だんさん、こんにちはぁ

>タイトルのことを EXCEL VBA をつかってやりたいのですが、
>どのようにプログラムを組むとできるのかが
>考えつきません。どなたか助けて頂けますか?
>
>下のような 5行*10列 の表に数字が記入されている状態です。
>
>  1234567890
> ------------
>1 | 1112111311
>2 | 1112211311
>3 | 1122211311
>4 | 1111111122
>5 | 1444441122
>
># 領域の種類を表す数字: 1,2,3,4

ラベリングですか?
もしそうであれば、画像処理のアルゴリズムを集めた本を一冊買っておくと便利ですよ。

方法はいくつもあるので、一例です。
(塗りつぶしのアルゴリズムを使用しています)

Sub Macro1()
  Dim x As Long, y As Long
  Dim Data(1 To 10, 1 To 5) As Long
  Dim n(1 To 4) As Long
  Dim v As Long

  ' データを配列に格納(A1:J5にあるのを仮定)
  For x = 1 To 10
    For y = 1 To 5
      Data(x, y) = Cells(y, x).Value
    Next
  Next

  ' 個数格納用配列の初期化
  For v = 1 To 4
    n(v) = 0
  Next
  ' 個数の検索
  For x = 1 To 10
    For y = 1 To 5
      v = Data(x, y)
      ' 値あり?
      If v <> 0 Then
        '' 同じ番号を塗りつぶし
        FillData x, y, Data()
        n(v) = n(v) + 1
      End If
    Next
  Next
  ' 結果表示
  For v = 1 To 4
    MsgBox v & " は " & n(v) & "ヶ所です"
  Next
End Sub

' 同じ番号を塗りつぶす
Sub FillData(ByVal x As Long, ByVal y As Long, ByRef Data() As Long)
  Dim v As Long

  v = Data(x, y)
  If v <> 0 Then
    Data(x, y) = 0
    ' 左
    If x > LBound(Data(), 1) Then
      If v = Data(x - 1, y) Then FillData x - 1, y, Data()
    End If
    ' 右
    If x < UBound(Data(), 1) Then
      If v = Data(x + 1, y) Then FillData x + 1, y, Data()
    End If
    ' 上
    If y > LBound(Data(), 2) Then
      If v = Data(x, y - 1) Then FillData x, y - 1, Data()
    End If
    ' 下
    If y < UBound(Data(), 2) Then
      If v = Data(x, y + 1) Then FillData x, y + 1, Data()
    End If
  End If
End Sub

ではではぁ
 ───────────────────────────────────────  ■題名 : Re:EXCELで 表の中の異なる領域 を数える方法  ■名前 : だん  ■日付 : 03/1/30(木) 21:51  -------------------------------------------------------------------------
   【お礼】Re:EXCELで 表の中の異なる領域 を数える方法

JuJu さん ありがとうございました。

 JuJu - 03/1/30(木) 18:27 -
 > ラベリングですか?
 > もしそうであれば、
 > 画像処理のアルゴリズムを集めた本を一冊買っておくと便利ですよ。
 > 方法はいくつもあるので、一例です。
 > (塗りつぶしのアルゴリズムを使用しています)

画像処理に使うアルゴリズムが使えるとは、
想像もしていませんでした。
このような処理はラベリングというのですね。
覚えておいて面白いアルゴリズムだと思いました。

時間が出来次第、画像処理アルゴリズム関係の本を見てきます。

PS.
もし手元に「この本はおすすめ!」という本があれば、
タイトルなどを教えていただけますか?
まだ画像処理に触れようともしていなかった自分が、
果たして良い本が良い本だと気付けるか、少し不安なので、
よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:EXCELで 表の中の異なる領域 を数える...  ■名前 : JuJu <juju-bbs@su-u.com>  ■日付 : 03/2/3(月) 12:40  -------------------------------------------------------------------------
   だんさん、こんにちはぁ

ちょっと体調不良のため、回答が遅れました。ごめんなさい。

>画像処理に使うアルゴリズムが使えるとは、
>想像もしていませんでした。
>このような処理はラベリングというのですね。
>覚えておいて面白いアルゴリズムだと思いました。

ラベリングについては、私は説明下手なので、こんな感じのキーワードで検索してみてね。
http://www.google.co.jp/search?q=%22%E3%83%A9%E3%83%99%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF%22+%E7%94%BB%E5%83%8F&lr=

>もし手元に「この本はおすすめ!」という本があれば、
>タイトルなどを教えていただけますか?

画像処理の本ですか?
画像処理だとどうしてもC言語になってしまうのですが、お勧めならこれです。
http://www.ari-web.com/books/tech/img-4785631244.htm
結構お高めで入門書なのに難易度も高いので、じっくり立ち読みでもしてご検討ください。

ではではぁ
 ───────────────────────────────────────  ■題名 : Re:EXCELで 表の中の異なる領域 を数える...  ■名前 : だん  ■日付 : 03/2/4(火) 17:32  -------------------------------------------------------------------------
   【お礼】Re:EXCELで 表の中の異なる領域 を数える方法

JuJu さん 重ね重ね、ありがとうございました。

さっそく おすすめの本 を見に行ってくることにします。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 674