プロが教える店舗&オフィスのセキュリティ対策術

お世話になっております。ExcelVBAを使って2か所の
緯度と経度から距離を測定したいのですが上手くいきません。
データ(緯度と経度)が入っているセルはデータ型で小数点7ケタまで入っています。
これをVBAを使用し数値データからシリアル値に変換し計算をしたいのです。

緯度と経度から距離を求める式はヒュベニの計算式を使用しています。
公式は距離=sqrt((M*dP)*(M*dP)+(N*cos(P)*dR)*(N*cos(P)*dR))です。
P=2点の平均緯度 radians((緯度01+緯度02))*24
dP=2点の緯度差 (緯度01-緯度02)*24
dR=2点の経度差 (経度01-経度02)*24
M=子午線曲率半径 6334834/sqrt((1-0.006674*sin(P)*sin(P))^3)
N=卯酉線曲率半径 6377397/sqrt(1-0.006674*sin(P)*sin(P))

作成した関数は
Function kyori(X1,Y1,X2,Y2)

Dim Latit01 As Double
Dim Longi01 As Double
Dim Latit02 As Double
Dim Longi01 As Double
Dim LatitXX1 As Date
Dim LongiYY1 As Date
Dim LatitXX2 As Date
Dim LongiYY2 As Date

Dim D As Double
Dim P As Double
Dim dP As Double
Dim dR As Double
Dim M As Double
Dim N As Double

'値の代入
Latit01 = X1
Latit02 = X2
Longi01 = Y1
Longi02 = Y2

'シリアル値に変換
LatitXX1 = format((Latit01 /24), "[h]:mm:ss.000")
LongiYY1 = format((Longi01 /24), "[h]:mm:ss.000")
LatitXX2 = format((Latit02 /24), "[h]:mm:ss.000")
LongiYY2 = format((Longi02 /24), "[h]:mm:ss.000")

P = (Application.WorksheetFunction.Radians((LatitXX1 + LatitXX2) / 2)) * 24
dP = (LatitXX1 - LatitXX2) * 24
dR = (LongiYY1 - LongiYY2) *24

M = 6334834 / Application.WorksheetFunction.sqrt((1-0.006674 * Sin(P) * Sin(P))^3)
N = 6377397 / Application.WorksheetFunction.sqrt((1-0.006674 * Sin(P) * Sin(P))

kyori = Application.WorksheetFunction.sqrt((M*dP*Application.WorksheetFunction.Pi()/180)*(M*dP*Application.WorksheetFunction.Pi()/180)+(N*sos(P)*dR*Application.WorksheetFunction.Pi()/180)*(N*cos(P)*dR*Application.WorksheetFunction.Pi/180))

これを実行するとシリアル値に変換するときに止まってしまいます。
エラーは出ず、Excekのセルには#VALUEと返されます。

どなたか教えてください。

A 回答 (3件)

ANo.2です。



> Excelでの結果は#NAME?が返されました。
>
> またエディターでブレイクポイントを打っても止まりませんでした。

こちらの環境(Excel2010)では、正常に値を返しますしブレイクポイントも効きます。
コードは標準モジュールに入れていますか?あと、Excelのバージョンは何でしょう?
「ExcelVBAでi緯度と経度から距離を」の回答画像3
    • good
    • 1
この回答へのお礼

mt2008さま

ありがとうございます。
出来ました。
私の環境はExcel2010で標準モジュールにも書いておりましたが
先ほどまでできませんでしたが今、できました。
お騒がせしてすいませんでした。
ありがとうございます。

お礼日時:2012/11/08 12:25

Date型変数に文字列を入れようとしてたり、かっこの数が合わなかったりして解りにくかったので、ざっくりと作り直してみました。


ちょっと自信がないですが大体こんな感じで良いんじゃないでしょうか。

Function kyori(X1, Y1, X2, Y2)

  Dim D As Double
  Dim P As Double
  Dim dP As Double
  Dim dR As Double
  Dim M As Double
  Dim N As Double
  
  With WorksheetFunction
  
    LatitXX1 = (X1 / 180) * .Pi
    LongiYY1 = (Y1 / 180) * .Pi
    LatitXX2 = (X2 / 180) * .Pi
    LongiYY2 = (Y2 / 180) * .Pi
    
    P = (LatitXX1 + LatitXX2) / 2
    dP = (LatitXX1 - LatitXX2)
    dR = (LongiYY1 - LongiYY2)
    
    M = 6334834 / Sqr((1 - 0.006674 * Sin(P) * Sin(P)) ^ 3)
    N = 6377397 / Sqr((1 - 0.006674 * Sin(P) * Sin(P)))
    
    kyori = Sqr((M * dP) * (M * dP) + (N * Cos(P) * dR) * (N * Cos(P) * dR))
  End With
End Function

この回答への補足

mt2008さま

ありがとうございます。
教えていただいた関数を実行してみました。
Excelでの結果は#NAME?が返されました。

またエディターでブレイクポイントを打っても止まりませんでした。

すいません。

補足日時:2012/11/08 11:49
    • good
    • 0

テストプログラムとデータのサンプルを!

この回答への補足

JazzCorp様

ありがとうございます。
ExcelにはX1(緯度1)が35.658599、Y1(経度1)が139.745443。
X2(緯度2)35.71007,、Y2(経度2)139.80948となっております。

ちなみにテストデータで東京タワーとスカイツリーの緯度経度です。
よろしくお願いします。

補足日時:2012/11/08 10:50
    • good
    • 0
この回答へのお礼

JazzCorpさま

ありがとうございました。
原因はよくわかりませんでしたができました。

お礼日時:2012/11/08 12:28

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