[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/06/06(Wed) 13:58
投稿者名:なべ
Eメール:
URL :
タイトル:
画像の自動読み込み
タイトルのとおりです
1つのフォルダ内の複数のナンバリングされた画像ファイルを順に自動的に開いてほしいのですが、どうにも行き詰ってしまいました。
VBはまだ初心者で、触り始めてからまだ1ヶ月ほどです。
下に組んだプログラムを載せておくので、指摘のほどお願いします。


Option Explicit

===========================================================
Private Sub Command1_Click()

'ココで画像フォルダを記憶させる

On Error GoTo Err_Command1_Click

Pic1.Cls

CommonDialog1.Filter = "*.bmp|*.bmp"
CommonDialog1.ShowOpen

Pic1.Picture = LoadPicture(CommonDialog1.FileName)

Text2.Text = Pic1.Width / Screen.TwipsPerPixelX - 4
Text1.Text = Pic1.Height / Screen.TwipsPerPixelY - 4

Exit_Command1_Click:
Exit Sub

Err_Command1_Click:
MsgBox ("ファイルを開く作業をキャンセルします")

Exit Sub
End Sub

=========================================================
Private Sub Command2_Click()
Unload Me

End Sub
=========================================================

Private Sub Command3_Click()

'==========関数の宣言==============
Dim i As Integer
Dim j As Integer
Dim n As Integer
Dim k As Integer
Dim col1 As Long
Dim col2 As Long
Dim sum1 As Long
Dim l As Integer
'==================================


'=================Excel開く宣言================
Dim xlSheet As Excel.Worksheet
Dim xlBook As Excel.Workbook
Dim xlApp As Excel.Application
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

xlApp.Visible = True
xlSheet.Activate
'==============================================

l = 0
'Excelの列担当繰り返し構文,画像ファイル分繰り返す
For l = 1 To Text3.Text

'1行目にナンバリングする
xlSheet.Cells(1, l).Value = l
   i = 0


'↓ココから画像を開くまでを自動化したい
'================画像を開く==================
Pic1.Cls

CommonDialog1.Filter = "*.bmp|*.bmp"
CommonDialog1.ShowOpen

Pic1.Picture = LoadPicture(CommonDialog1.FileName)

Text2.Text = Pic1.Width / Screen.TwipsPerPixelX - 4
Text1.Text = Pic1.Height / Screen.TwipsPerPixelY - 4
'=============================================

'=======以下PopImagingの作業"垂直投影"を再現=======
    For i = 0 To Text2.Text - 1

       sum1 = 0
       j = 0

       For j = 0 To Text1.Text - 1
          col1 = Pic1.Point(i, j)
          col2 = 0

          For k = 0 To 256
             If col1 = RGB(k, k, k) Then
                col2 = k
             End If
          Next k
  
       sum1 = sum1 + col2
       Next j

       sum1 = sum1 / Text1.Text
       '2行目からデータを入力
       xlSheet.Cells(i + 2, l).Value = sum1
    
    Next i
'=================================================

Dim Lngst As Long
Lngst = Timer
Do While Timer - Lngst < 1
DoEvents
Loop

Next l

'============Excel閉じる================
xlApp.DisplayAlerts = False
xlSheet.SaveAs "C:\Documents and Settings\a1417393\デスクトップ\test1.csv", xlCSV
xlApp.Quit

Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
'========================================

End Sub

投稿時間:2007/06/07(Thu) 19:30
投稿者名:
Eメール:
URL :
タイトル:
Re: 画像の自動読み込み
ヒントをいくつか挙げますね。

> CommonDialog1.Filter = "*.bmp|*.bmp"
> CommonDialog1.ShowOpen
>
> Pic1.Picture = LoadPicture(CommonDialog1.FileName)

コモンダイアログはファイル単位の指定になるので、
フォルダを指定する仕組みの方がいいんじゃないでしょうか?
もしくは指定されたファイルパスからフォルダパスの部分だけ切り取るかですかね。

右のメニューにあるサンプルをいくつか使って、

 1.指定されたフォルダ内にある画像ファイルを列挙して変数に保持
   ↓
 2.必要ならばファイルの番号順にソート
   ↓
 3.ループさせて順番に画像を表示・処理

といったかたちで処理するといいと思います。

投稿時間:2007/06/11(Mon) 12:42
投稿者名:なべ
Eメール:
URL :
タイトル:
Re^2: 画像の自動読み込み
>
>  1.指定されたフォルダ内にある画像ファイルを列挙して変数に保持
>    ↓
>  2.必要ならばファイルの番号順にソート
>    ↓
>  3.ループさせて順番に画像を表示・処理

1と2はできたんですが、3.の"順番に画像を表示"する部分がどうにもできません。
今は左のカテゴリの中から指定フォルダの画像の名前を表示させるプログラムを改良しているところです。

Private Sub Command1_Click()
Dim strMyFile() As String
Dim strBMPFile  As String
Dim intKen      As Integer
Dim i           As Integer
Dim kakutyousi  As String

kakutyousi = "bmp"
'ディレクトリー内の全ファイル・フォルダを読み込む
strBMPFile = Dir$(File1.Path & "\", vbDirectory Or vbHidden Or vbSystem)

'strBMPFileが空になるまで繰り返し
Do While strBMPFile <> ""

'=====名前の表示=====
   If StrComp(Right$(strBMPFile, 3), kakutyousi, 1) = 0 Then
      intKen = intKen + 1
      ReDim Preserve strMyFile(intKen)
      'ファイル名を配列に格納
      strMyFile(intKen) = strBMPFile
   End If
   strBMPFile = Dir$ '次のファイル名を読み込み
'====================

Loop

For i = 1 To intKen
   Text1.Text = Text1.Text & strMyFile(i) & vbCrLf

この「名前の表示」の部分を画像表示にしたいのですが、どんな関数を使えばいいのでしょうか?

投稿時間:2007/06/11(Mon) 13:11
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re^3: 画像の自動読み込み
そこを変更するのはイマイチ。

strMyFile(intKen)にファイルの一覧を取得することを目的としているのですから、
それ以外のことをこの関数(Command1_Click)内でしないほうがいいと思います。
# できれば、この処理自体も、自作関数として、Command1_Clickから呼ぶ形に。
変数に格納された値を保持して、strMyFile(intKen)の内容を次の処理に渡すように
設計してみては?。

>  1.指定されたフォルダ内にある画像ファイルを列挙して変数に保持
>    ↓
>  2.必要ならばファイルの番号順にソート
>    ↓
>  3.ループさせて順番に画像を表示・処理
それぞれの処理を別関数にすると分かり易くなるように分けてくれてますよ?たぶん。

投稿時間:2007/06/11(Mon) 15:30
投稿者名:なべ
Eメール:
URL :
タイトル:
Re^4: 画像の自動読み込み
> それぞれの処理を別関数にすると分かり易くなるように分けてくれてますよ?たぶん。

なにぶん初心者なもので、別関数にするやり方がわからないんですが、どのようにすればいいのでしょうか?
c言語の関数呼び出しみたいな感じになるんでしょうか?

投稿時間:2007/06/11(Mon) 18:38
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re^5: 画像の自動読み込み
> c言語の関数呼び出しみたいな感じになるんでしょうか?
…うん(^^;まぁ。そんな感じの構造ではあるけど、関数の定義を
先にする必要は無いし(後から定義していてもVBが見つけてくれます)
include で読み込む形ではなくて、クラスのメンバとして参照するから
VBの方が楽かもしれません。

・・・ただ、このレベルは入門本を1冊読めば分かる話で、プログラムを
する以前の問題だと思います。掲示板で教わることじゃないっていうか、
これが分からないということは、他にたくさん足らないだろうと予想
できるわけです。そうなると、説明するたびに説明することが増えて、
『そのくらい最初に勉強しておけよ』ってなります。

入門本を買うか、
[Visual Basic 中学校]さんのようなサイトで授業を一通り読んでみるとか。。。
http://homepage1.nifty.com/rucio/main/main.htm

[VB6.0]動作検証していません。構造だけ理解してください。
Option Explicit

Private Sub Command1_Click()
    Dim strBmpFilePath() As String
    
    'ファイルパス取得
    strBmpFilePath = GetBmpFilePath(File1.Path)
    
    'ソート
    Call BubbleSort(strBmpFilePath)
    
    'エクセル表示
    Call DispExcel(strBmpFilePath)
    
End Sub

'ファイルパスを指定して、Bitmapファイルの一覧を取得する
Private Function GetBmpFilePath(ByVal SeachPath As String) As String() '←戻り値の指定
    Dim strMyFile() As String
    Dim strBMPFile  As String
    Dim intKen      As Integer
    Dim i           As Integer
    Dim kakutyousi  As String

    kakutyousi = "bmp"
    'ディレクトリー内の全ファイル・フォルダを読み込む
    strBMPFile = Dir$(SeachPath & "\", vbDirectory Or vbHidden Or vbSystem)
    
    'strBMPFileが空になるまで繰り返し
    Do While strBMPFile <> ""
       If StrComp(Right$(strBMPFile, 3), kakutyousi, 1) = 0 Then
          intKen = intKen + 1
          ReDim Preserve strMyFile(intKen)
          'ファイル名を配列に格納
          strMyFile(intKen) = strBMPFile
       End If
       strBMPFile = Dir$ '次のファイル名を読み込み
    Loop
    
    GetBmpFilePath = strMyFile '←戻り値の設定
End Function

投稿時間:2007/06/11(Mon) 21:23
投稿者名:なべ
Eメール:
URL :
タイトル:
Re^6: 画像の自動読み込み
すいません。関数知ってました。さっき入門本で確認したら普通に使ってることでした。
お騒がせしてすいません。
それはそうと、ココに表示したプログラムはあくまで試作なので、とりあえず組んでみて動くかどうかを見るものです。同じコマンド内にたくさん詰まってるとか気にしないでください。これから調整する予定です。
それから、プログラムは無事自己解決できました。
るしぇさん、プログラムありがとうございます。参考にさせていただきます。私の組んだプログラムにフィードバックしていけるようがんばります。
それから、琴さん。道しるべをありがとうございました。おかげで八方塞の状況を脱出できました。