Excel VBAで画像解析を行いたいのですが、その際に画像データを画素毎に抽出しなければなりません。bmpなど無圧縮のファイルなら、バイナリで読み込んで何とかなりますが、jpg等はどうにもなりません。

Excel VBAで画像ファイルの画素データを直接読み取る方法はありませんか。

他の開発言語を使ったほうがやりやすいのは承知の上ですが、解析結果も配列で返ってくるので、その後のグラフ化の処理などもExcel上で統合してやりたいのです。

宜しくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

実際には、やってないので当てずっぽうです。



まず、ユーザーフォームを作成。コンポーネントの「イメージ」を貼りつける。VBAでイメージのプロパティを操作して、jpgファイルを読み込み。同じくプロパティの.X .Yを指定して、RGB()値を取得。

で、どうでしょう

この回答への補足

回答ありがとうございます。
が、Imageコントロールのプロパティにはxやy、その他座標が指定できそうなプロパティが見当たりません。やはり無理なのでしょうか?

補足日時:2001/07/27 18:42
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL2000 VBAにおいてユーザフォーム上での入力チェック

ユーザフォーム上のテキストボックスに数字のみ入力するように制御したいのですが、英字が入力された場合、エラーメッセージを出した後、フォーカスをそのテキストボックスに戻したいのですが、うまくいかず、次のところにフォーカス移動してしまいます。どのようにすればいいか、ご教示願います。

Aベストアンサー

どのように、エラーメッセージを出しているのかわからないのですが(メッセージボックス?)、この部分でsetFocusがうまくいってないのかなと思います。
ご質問の内容と設計が異なりますが、初めから数字しか打てないようにしてはどうでしょう。

例です。
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case vbKey0, vbKey1, vbKey2, vbKey3, vbKey4, vbKey5, vbKey6, vbKey7, vbKey8, vbKey9
Case Else
KeyAscii = 0
End Select
End Sub

QEXCEL2000とEXCEL2003のVBAについて

現在、EXCEL2000で下記のコードを実行しています。
が、EXCEL2003で実行すると、 .UsedRange.Copy myb
のコードが実行されているのにコピー出来ていません。

ファイルは開いていて、エラーは出ていないのです。
問題点わかる方教えていただけますか?


Sub 日別データ読込()

Dim rngsaki As Range
Dim pathmacrobook As String
Dim namebook As String
Dim motobook As Workbook
Dim myb As Variant

Set rngsaki = Workbooks("残高集計用.xls").Worksheets(3).Range("a2")
pathmacrobook = ThisWorkbook.Path & "\CSV読込データ12\"
namebook = Dir(pathmacrobook & "*.xls")

Do While Not namebook = ""


Set motobook = Workbooks.Open(pathmacrobook & namebook)
Set myb = Workbooks("残高集計用.xls").Worksheets(3).Range("A65536").End(xlUp)
With motobook.Worksheets("Sheet1")
.UsedRange.Copy myb
End With

motobook.Close False
namebook = Dir()

Loop

MsgBox "完了しました"
End Sub

現在、EXCEL2000で下記のコードを実行しています。
が、EXCEL2003で実行すると、 .UsedRange.Copy myb
のコードが実行されているのにコピー出来ていません。

ファイルは開いていて、エラーは出ていないのです。
問題点わかる方教えていただけますか?


Sub 日別データ読込()

Dim rngsaki As Range
Dim pathmacrobook As String
Dim namebook As String
Dim motobook As Workbook
Dim myb As Variant

Set rngsaki = Workbooks("残高集計用.xls").Worksheets(3).Range("a2")
pathmacrobook = T...続きを読む

Aベストアンサー

こんにちは。

まず、今回のマクロだけでは、

>Set rngsaki = Workbooks("残高集計用.xls").Worksheets(3).Range("a2")
これは、生きていないですね。

実際に試したわけではないのですが、バージョンによって違いが出るとも思えないですね。

.Worksheets("Sheet1").UsedRange.Copy

ただ、ここが気になりますね。空の場合は、「1セル」しかコピーしませんが、それを貼り付けても、無駄になってしまいます。
絶対に、空はないならよいのですが、本当は、
If WorksheetFunction.CountA(Worksheets("Sheet1").Cells) >0 Then
などで、シートを検査したほうがよいと思いますね。なお、必ず、Sheet1 というシートがあるという前提です。

それから、最後尾の次になるから、myb.Offset(1) でしょうね。
正しく動くかは分かりませんが、書き換えてみました。

Sub 日別データ読込R()
  Dim DestBook As Workbook
  Dim pathmacrobook As String
  Dim namebook As String
  Dim myb As Range
  
  pathmacrobook = ThisWorkbook.Path & "\CSV読込データ12\"
  
  Set DestBook = Workbooks("残高集計用.xls")
  namebook = Dir(pathmacrobook & "*.xls")
  
  Do While Not namebook = ""
    Set myb = DestBook.Worksheets(3).Range("A65536").End(xlUp)
    With Workbooks.Open(pathmacrobook & namebook)
       On Error Resume Next
        .Worksheets("Sheet1").UsedRange.Copy myb.Offset(1)
       On Error GoTo 0
       .Close False
    End With
    namebook = Dir()
  Loop
  Set DestBook = Nothing
  MsgBox "完了しました"
End Sub

こんにちは。

まず、今回のマクロだけでは、

>Set rngsaki = Workbooks("残高集計用.xls").Worksheets(3).Range("a2")
これは、生きていないですね。

実際に試したわけではないのですが、バージョンによって違いが出るとも思えないですね。

.Worksheets("Sheet1").UsedRange.Copy

ただ、ここが気になりますね。空の場合は、「1セル」しかコピーしませんが、それを貼り付けても、無駄になってしまいます。
絶対に、空はないならよいのですが、本当は、
If WorksheetFunction.CountA(Worksheets("...続きを読む

Q画像データがbmpでしか保存できなくなった?

おはようございます。

東芝ダイナブックT5/X16PME
ウィンドウズXPホームエディション
I.E6.0です。

写真などの画像データをネット上から拾ってくるとき
写真のうえにマウスをあわせると
イメージツールバーが出て、
保存アイコンを選択すると、
自動的にその写真の「名前」と「種類(拡張子)」が表示され、
「保存」をクリックするとそれでおっけー・・・ですよね。

なのになぜか
jpgの写真を保存したくても、
bmpしか「種類」のバーにないんです。
あきらかに保存したいデータがjpgなのに。

そこで、名前を適当につけて、拡張子をjpgにすると、
そのデータがjpgとして保存できることを確認しました。

しかし
データの上にマウスをあわせ、
イメージツールバーの保存をクリックした時点の
状態で保存すると
「無題」のbmpデータとして保存されてしまいます。

これっておかしくないですか?
それともなんか勘違いしてますか?

わかんなくなっちゃいましたぁ。
詳しくご教授くださいませ。

よろしくお願いいたします。

おはようございます。

東芝ダイナブックT5/X16PME
ウィンドウズXPホームエディション
I.E6.0です。

写真などの画像データをネット上から拾ってくるとき
写真のうえにマウスをあわせると
イメージツールバーが出て、
保存アイコンを選択すると、
自動的にその写真の「名前」と「種類(拡張子)」が表示され、
「保存」をクリックするとそれでおっけー・・・ですよね。

なのになぜか
jpgの写真を保存したくても、
bmpしか「種類」のバーにないんです。
あきらかに保存したいデ...続きを読む

Aベストアンサー

1.「IE のキャッシュが壊れているから」が最も可能性が高いです。
  IE のキャッシュを、削除か、再構築してください。
  
削除は、
  IEのツール→インターネットオプションで
  全般タグの「ファイルの削除」をクリック
  「すべてのオフラインコンテンツを削除する」にチェックを入れます
再構築は、
  スタート→検索→ファイルやフォルダをクリック
  Temporary Internet Files を探し、そのサイズを調べる。
  次に、IEのツール→インターネットオプションの全般タグで
  「設定」をクリック
  ‘使用するディスク領域’を、先ほど調べたサイズより小さい値に変更する。
  適用をクリックするとキャッシャは再構築されるのでjpgファイルが
  正常に保存できる事があります。

2.画像ファイルのダウンロードが終わっていない
  JPGに限らず、GIFでも何でも、ダウンロードがまだ
  終わってない状態で画像の保存をしようとすると出てました。
  「更新」して問題を解決しました。

3.ウィンドウの開きすぎ
  ウィンドウの開きすぎが直接の原因とは考えにくいですが、
  沢山のウィンドウを開いた状態で画像の保存をしようとすると、問題がでました。
  おそらくリソースの不足だと思います。

4.ページによっては故意にJPEGでの保存をできなくしている所もあるそうです。

1.「IE のキャッシュが壊れているから」が最も可能性が高いです。
  IE のキャッシュを、削除か、再構築してください。
  
削除は、
  IEのツール→インターネットオプションで
  全般タグの「ファイルの削除」をクリック
  「すべてのオフラインコンテンツを削除する」にチェックを入れます
再構築は、
  スタート→検索→ファイルやフォルダをクリック
  Temporary Internet Files を探し、そのサイズを調べる。
  次に、IEのツール→インターネットオプションの全般タグで
  「設...続きを読む

Qexcel vba

マクロ中次のコードを入力したとき、コンパイルエラー
修正候補:区切り記号または)
というメッセージがでて赤文字でコードが表示され
カーソルが"A1".valueの.のところになりますが、原因がよくわかりません。
何か間違っていますか。

Workbooks("LOG-analysis-tool1.xls").xfile_Name1.Range("A1".value)=1+Workbooks("LOG-analysis-tool1.xls").xfile_Name1.Range("A1".value)

Aベストアンサー

間違いがいくつかありそうですねえ!!
xfile_Name1 は何ですか?
シート名ですか? ならば、

Workbooks("LOG-analysis-tool1.xls").SHEETS("xfile_Name1").Range("A1").VALUE= _
1+Workbooks("LOG-analysis-tool1.xls").SHEETS("xfile_Name1").Range("A1").VALUE

QExcel VBA SetFocus

環境:Excel 2002です

UserForm1での質問です
Flame5にTextBox14とTextBox15があります
TextBox14とTextBox15のBeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)後
Flame2にあるTextBox1にSetFocusしたいのですがエラーが発生します

実行時エラー 2147467259(800004005)

異なるFlameにSetFocusする方法があるのでしょうか?
Flame5の中でTextBox14及びTextBox15のSetFocusはできます

TextBox14とのTextBox15のBeforeUpdateのプロシージャです
Private Sub TextBox14_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

If Len(Me.TextBox14.Text) <> 0 Then

Dim a As Variant
a = 100 - Val(Me.TextBox14.Text)
Me.TextBox15.Text = a

Dim i As Integer
For i = 1 To 4
Me.Controls("TextBox" & i).Enabled = True
Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色)
Next i

End If

Me.TextBox1.SetFocus

End Sub

Private Sub TextBox15_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

If Len(Me.TextBox15.Text) <> 0 Then

Dim a As Variant
a = 100 - Val(Me.TextBox15.Text)
Me.TextBox14.Text = a

Dim i As Integer
For i = 1 To 4
Me.Controls("TextBox" & i).Enabled = True
Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色)
Next i

End If

UserForm1.TextBox1.SetFocus

End Sub

ご支援願います

環境:Excel 2002です

UserForm1での質問です
Flame5にTextBox14とTextBox15があります
TextBox14とTextBox15のBeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)後
Flame2にあるTextBox1にSetFocusしたいのですがエラーが発生します

実行時エラー 2147467259(800004005)

異なるFlameにSetFocusする方法があるのでしょうか?
Flame5の中でTextBox14及びTextBox15のSetFocusはできます

TextBox14とのTextBox15のBeforeUpdateのプロシージャです
Private Sub TextBox14_BeforeUpdate(ByVal Cancel As MSFor...続きを読む

Aベストアンサー

こちらでは解決しているようです。
http://www.moug.net/faq/viewtopic.php?t=65607

別解を。

質問者さんの図では、
フレームの本来の使い方(オプションボタン、チェックボックスなどの1個のみを選択する)をしていません。

見た目だけを、分かり易くグループ化しているのみです。

これなら、苦労してフレーム絡みのフォーカス移動を制御するより

ラベルを、フレームのように見せかけて
(SpecialEffect プロパティ を 3 に設定)
(テキストボックスは最前面に表示)
(見出し部分はラベルを重ねる) 等々

質問者さんのコードで動かすほうがずっと簡単かと思います。


このカテゴリの人気Q&Aランキング

おすすめ情報