アプリ版:「スタンプのみでお礼する」機能のリリースについて

1000×1000程度の配列があります。内容はLongです。
例えばPIX(1000, 1000)のうちPIX(500,200)~PIX(500,300)の合計を
WorksheetFunction.Sum(PIX・・・・・・)のように求めることはでき
るのでしょうか。
よろしくお願いします。

質問者からの補足コメント

  • WindFaller様

    早速のご指導ありがとうございます。

    配列へデータを格納するのはシートを介していません。
    画像ファイルの画像をフレームに貼りつけてGetDIBits(API)を利用して各ピクセルの
    RGBを配列に格納しています。

    正しくはさらにRGBをHSBに変換してB値のみを格納しています。
    配列のインデックスは、画像のX、Y座標に対応しています。
    このデータを一旦シートに展開すればRangeを使って簡単に合計を求めることができる
    のですが、高速で処理したいためシートを介せず配列から直接合計を求められないかと
    思いました。同じく高速最優先のためFor Nextで足し算もしたくありません。
    わがままいってすみません。
    範囲の指定がなければWorksheetFunction.Sum(PIX_RGB)で求められるのですが範囲の指
    定の仕方がわかりません。
    よろしくお願いします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/04/03 19:35
  • 誤りがありましたので訂正します。
    補足文のPIX_RGBは誤りでPIXが正しい記述です。
    申し訳ありませんでした。

      補足日時:2017/04/03 19:39

A 回答 (5件)

>で範囲指定がなければ合計(36)は求められますが・・・・


>私がなにか勘違いしてるのでしょうか。
いえいえ、勘違いしていません。

>例えばの話で、ここでPIX(0,1)~PIX(0,2)の合計、5を求めたいと思います。
>その方法を知りたいと思ってます。
「WorksheetFunction.Sumの引数へ部分範囲を指定することができない」と私は言っています。
(厳密に言えば、そのような方法を私も探しましたが、そのような方法はなかった。ということです。
只、私のスキルが未熟なため、その方法を検索出来なかった可能性もありますが。)
WorksheetFunction.Sumが取れる引数は、「配列全体」です。

個々に、PIX(0,1),PIX(0,2)、PIX(0,3)・・・のように個々の値を引数として渡す方法(最大255個まで)も
ありますが、おそらく、それはあなたが、望んだ方法ではないと思います。
    • good
    • 1
この回答へのお礼

tatsu99様
了解しました。大変失礼しました。
やっぱり勘違いしてましたね。ごめんなさい。

お礼日時:2017/04/04 21:18

>範囲の指定がなければWorksheetFunction.Sum(PIX_RGB)で求められるのですが範囲の指


>定の仕方がわかりません。
この方法はないと思います。
現実的には、for nextでの足し算かと。
もしそれで、遅くて使い物にならないなら、他の言語で処理するか、
任意の範囲を処理できる自前のWorksheetFunctionをC++等で自作し、それを呼び出す以外に方法はないかと。
    • good
    • 0
この回答へのお礼

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でも速度は全く変わらないのは承知して
いますが、単純な」記述方法があるのなら学びたいと思います。

お礼日時:2017/04/04 20:40

話が、かなり変わってしまいますが、私が#2で言っているのは、速い遅いとはいっても、現実には、そんなに差がないのではないか、ということです。


時々、オブジェクトのオーバーヘッドの問題を抜きにして、部分的に速い・遅いを言う人もいます。

>同じく高速最優先のためFor Nextで足し算もしたくありません。

それは、計測データはありますか?
昨今、VB系で、1秒以下の問題で、クレームをつける人もいます。0.2秒では、すでに遅いのだから、これはダメだとか。

元のご質問を見ていても、1次元で100個程度の計算をメモリ上で行うのに、一体、どの程度の時間が掛かるというのでしょうか?

For Next は、初歩的なレベルから、高度なアルゴリズムまで登場する基本的な構造です。For Next ということ自体を否定するというのは、少なくとも、VB系の質問の範疇を越えているように思うのです。

関数型で処理したいというのでしたら、他の言語でご質問なさっていただいたほうがよいのではないでしょうか。
    • good
    • 1
この回答へのお礼

WindFaller様
再度のご指導ありがとうございました。
おっしゃる通り、定量的な計測データに基づいた判断を行うべきですね。

ただ、テクニカルな観点から、単純に1行の記述で解決する記述方法が
あるのかどうかも興味がありますが、プログラム全体を眺めた場合、
おっしゃる通りたいした問題ではないかも知れません。

配列→一発 合計の記述方法については早い遅いは別にして興味がありま
すので、もう少し閉じずにおきます。

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

お礼日時:2017/04/04 19:26

こんにちは。



あくまでも、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/ …
この回答への補足あり
    • good
    • 0

> 内容は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に格納とか。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
高速で合計を求めたいためワークシート関数を思いつきました。
Forで回す以外の方法はやっぱりないのでしょうか。

お礼日時:2017/04/02 11:56

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

このQ&Aを見た人はこんなQ&Aも見ています