A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
>で範囲指定がなければ合計(36)は求められますが・・・・
>私がなにか勘違いしてるのでしょうか。
いえいえ、勘違いしていません。
>例えばの話で、ここでPIX(0,1)~PIX(0,2)の合計、5を求めたいと思います。
>その方法を知りたいと思ってます。
「WorksheetFunction.Sumの引数へ部分範囲を指定することができない」と私は言っています。
(厳密に言えば、そのような方法を私も探しましたが、そのような方法はなかった。ということです。
只、私のスキルが未熟なため、その方法を検索出来なかった可能性もありますが。)
WorksheetFunction.Sumが取れる引数は、「配列全体」です。
個々に、PIX(0,1),PIX(0,2)、PIX(0,3)・・・のように個々の値を引数として渡す方法(最大255個まで)も
ありますが、おそらく、それはあなたが、望んだ方法ではないと思います。
No.4
- 回答日時:
>範囲の指定がなければWorksheetFunction.Sum(PIX_RGB)で求められるのですが範囲の指
>定の仕方がわかりません。
この方法はないと思います。
現実的には、for nextでの足し算かと。
もしそれで、遅くて使い物にならないなら、他の言語で処理するか、
任意の範囲を処理できる自前のWorksheetFunctionをC++等で自作し、それを呼び出す以外に方法はないかと。
tatsu99様
ご意見ありがとうございます。
Sub Test()
Dim PIX(3, 3) As Long
PIX(0, 0) = 1
PIX(0, 1) = 2
PIX(0, 2) = 3
PIX(0, 3) = 4
PIX(1, 0) = 5
PIX(1, 1) = 6
PIX(1, 2) = 7
PIX(1, 3) = 8
MsgBox WorksheetFunction.Sum(PIX)
End Sub
で範囲指定がなければ合計(36)は求められますが・・・・
私がなにか勘違いしてるのでしょうか。
例えばの話で、ここでPIX(0,1)~PIX(0,2)の合計、5を求めたいと思います。
その方法を知りたいと思ってます。
もちろんその程度のことならFor Nextでも速度は全く変わらないのは承知して
いますが、単純な」記述方法があるのなら学びたいと思います。
No.3
- 回答日時:
話が、かなり変わってしまいますが、私が#2で言っているのは、速い遅いとはいっても、現実には、そんなに差がないのではないか、ということです。
時々、オブジェクトのオーバーヘッドの問題を抜きにして、部分的に速い・遅いを言う人もいます。
>同じく高速最優先のためFor Nextで足し算もしたくありません。
それは、計測データはありますか?
昨今、VB系で、1秒以下の問題で、クレームをつける人もいます。0.2秒では、すでに遅いのだから、これはダメだとか。
元のご質問を見ていても、1次元で100個程度の計算をメモリ上で行うのに、一体、どの程度の時間が掛かるというのでしょうか?
For Next は、初歩的なレベルから、高度なアルゴリズムまで登場する基本的な構造です。For Next ということ自体を否定するというのは、少なくとも、VB系の質問の範疇を越えているように思うのです。
関数型で処理したいというのでしたら、他の言語でご質問なさっていただいたほうがよいのではないでしょうか。
WindFaller様
再度のご指導ありがとうございました。
おっしゃる通り、定量的な計測データに基づいた判断を行うべきですね。
ただ、テクニカルな観点から、単純に1行の記述で解決する記述方法が
あるのかどうかも興味がありますが、プログラム全体を眺めた場合、
おっしゃる通りたいした問題ではないかも知れません。
配列→一発 合計の記述方法については早い遅いは別にして興味がありま
すので、もう少し閉じずにおきます。
ありがとうございました。
No.2
- 回答日時:
こんにちは。
あくまでも、Excelを前提ということでお話をさせていただきます。
>PIX(1000, 1000)のうちPIX(500,200)~PIX(500,300)
ということも、見かけでは多重配列ですが、この目的とするところ配列は、1次元ですね。
むろん、.NetFrameWork でしたら、ArrayList などがありますから、それを使えば違ってきますが、配列に代入の問題が残っています。
もともと、PIX(1000,1000)をどのようにして作ったか、ということに遡って考えると、逆に、最初から、500行列目の200列から、100列を取り出して、それでどうするか決めればよいだけのことではないかと思います。
>高速で合計を求めたいためワークシート関数を思いつきました。
それに、どれほど違うか、計測してみました。
Sub Test1()
Dim ret1 As Long
Dim ar
ar = Range(Cells(500, 200), Cells(500, 300))
ret1 = WorksheetFunction.Sum(ar)
Debug.Print ret1
End Sub
Sub Test2()
Dim PIX() As Variant
Dim ret2 As Long
Dim i As Long, j As Long
Dim myTime(1) As Long
PIX = Range("A1:ALL1000").Value
For i = 0 To 100
ret2 = ret2 + PIX(500, 200 + i)
Next
Debug.Print ret2
End Sub
結果は、以下の通り、単位は、1/1000 秒です。
( Win APIのtimeGetTime を使用)
Test1: 1
Test1: 1
Test2: 268
Test2: 281
なお、以下の辺りが参考になるのではないでしょうか。
https://msdn.microsoft.com/ja-jp/library/office/ …
No.1
- 回答日時:
> 内容はLongです。
> ~PIX(500,300)の合計を
合計した値はLongの範囲超えるんでしょうか?
気にしなくてOKなら、
Dim pix_sum as long
Dim i as integer
pix_sum=0
For i=200 to 300
pix_sum=pix_sum + PIX(500,i)
Next i
で、pix_sumに格納とか。
回答ありがとうございました。
高速で合計を求めたいためワークシート関数を思いつきました。
Forで回す以外の方法はやっぱりないのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Python画像処理について 1 2022/05/17 17:40
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Visual Basic(VBA) 改行ごとに行を追加し、数量を分割 4 2023/07/11 16:39
- Excel(エクセル) 別シートに毎回異なるデータをコピーする 7 2022/06/24 09:02
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- アンテナ・ケーブル 4Kチューナーの受信レベルについて 1 2022/04/13 08:02
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について 1 2022/04/23 11:49
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
VBAで配列の計算
Excel(エクセル)
-
VBAのWorksheetFunctionの引数に配列を使いたい
PowerPoint(パワーポイント)
-
エクセルVBAでApplication.SumとWorksheetFunction.Sum
PowerPoint(パワーポイント)
-
-
4
別のシートから値を取得するとき
Visual Basic(VBA)
-
5
VBA 配列に格納した値の平均のやり方についてお教え願います
Visual Basic(VBA)
-
6
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
7
VBA 1次元配列を2次元に追加する
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
エクセルでXY座標に並べられた...
-
大量の変数を定義するにはどう...
-
Excel2010のinputboxで複数デー...
-
1ビットごとの配列を作りたい
-
OutOfMemoryExceptionの回避策...
-
配列の中の最大値とそのインデ...
-
VB.NETの配列にExcelから読み込...
-
エクセルVBAで実行時エラー7、...
-
COBOLの基本的な事なので...
-
Dir関数で読み取り順を操作でき...
-
EXCEL VBA 配列デー...
-
複数のtextboxの処理を一括で行...
-
Excelのメモリ(配列)の上限は2G...
-
Imagelist の使い回しについて
-
countif/sumifのようなVBA関数
-
VB.NETの配列とArrayListについ...
-
VBAにて、配列のデータを一度に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Excel2010のinputboxで複数デー...
-
エクセルでXY座標に並べられた...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
OutOfMemoryExceptionの回避策...
-
Dir関数で読み取り順を操作でき...
-
CheckBoxの配列化
-
構造体配列内の文字列検索のよ...
-
COBOLの基本的な事なので...
-
Redim とEraseの違いは?
-
VBAで配列引数を値渡しできない...
-
2次元配列の初期値
-
配列の中の最大値とそのインデ...
-
VB6からの移行したいけど、VB.N...
-
大量の変数を定義するにはどう...
-
VB6のメモリ解放に関して
おすすめ情報
WindFaller様
早速のご指導ありがとうございます。
配列へデータを格納するのはシートを介していません。
画像ファイルの画像をフレームに貼りつけてGetDIBits(API)を利用して各ピクセルの
RGBを配列に格納しています。
正しくはさらにRGBをHSBに変換してB値のみを格納しています。
配列のインデックスは、画像のX、Y座標に対応しています。
このデータを一旦シートに展開すればRangeを使って簡単に合計を求めることができる
のですが、高速で処理したいためシートを介せず配列から直接合計を求められないかと
思いました。同じく高速最優先のためFor Nextで足し算もしたくありません。
わがままいってすみません。
範囲の指定がなければWorksheetFunction.Sum(PIX_RGB)で求められるのですが範囲の指
定の仕方がわかりません。
よろしくお願いします。
誤りがありましたので訂正します。
補足文のPIX_RGBは誤りでPIXが正しい記述です。
申し訳ありませんでした。