- 締切済み
緯度経度をエクセルで一括自動変換
例えば以下のように文字数がバラバラの 60進法で表された緯度経度の情報があったとします。 N34'17'31.03 E135'16'32.96 N34'17'44.06 E135'31'18.5 N35'20'44.67 E135'7'3.66 N34'57'25.71 E135'57'41.48 N34'57'25.71 E135'57'41.48 N35'4'59.77 E135'3'2.91 N34'48'55.77 E134'43'41.06 これを一括で変換し、10進法で表したいのです。 文字数がバラバラなので、条件としては区切り文字である 'を利用して変換するしかないと思っています。 (例)10進法にする計算~手動ならば~ N35'4'59.77 E135'3'2.91 ならば、手動でするには N35'4'59.77=35+(4/60)+(59.77/3600) E135'3'2.91=135+(3/60)+(2.91/3600) で導かれます。手動では文字数関係なく '区切りで計算できるので、このような簡単なエクセル計算で 成り立ちます。が、大量にある場合はそれも時間がかかり 厳しい状況です。完全自動化のためには良い関数が浮かびません・・。 どうかご教授くださいませ。 'がPointである事はわかっているのですが。。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
順に処理していけば、さほど難しい部分はありませんが、 手順がやたらと多くなってしまうのが難点ですね。 まず作業列を用いた解決を示します。 ●緯度と経度が同一のセルに入っている場合 ※緯度と経度があらかじめ別のセルに分かれている場合は3から。 元のデータがA列に入っているものとすると、 0.緯度と経度の区切(" ")の位置を探す B1セル:=FIND(" ",A1) 1.緯度を取り出す C1セル:=LEFT(A1,B1-1) 2.経度を取り出す D1セル:=RIGHT(A1,LEN(A1)-B1) ●緯度について 緯度のデータがC列に入っているものとすると、 3.最初の"'"の位置を探す E1セル:=FIND("'",C1) 4.2番目の"'"の位置を探す F1セル:=FIND("'",C1,E1+1) 5.度の値を取り出す G1セル:=MID(C1,2,E1-2) 6.分の値を取り出す H1セル:=MID(C1,E1+1,F1-E1-1) 7.秒の値を取り出す I1セル:=MID(C1,F1+1,LEN(C1)-F1) 8.十進法に直す J1セル:=G1+H1/60+I1/3600 ※経度についても同様です。 ●一発でやってみる 8の数式に7~3の数式を順に代入していけば、 一つの数式にまとめることもできます。 ただし、同じ計算を何度も繰り返すことになりますから、 データの量によっては処理速度に問題が出るかもしれませんし、 保守性も悪くなります。 緯度または経度のデータがC列に入っているものとすると、 =MID(C1,2,FIND("'",C1)-2)+MID(C1,FIND("'",C1)+1,FIND("'",C1,FIND("'",C1)+1)-FIND("'",C1)-1)/60+MID(C1,FIND("'",C1,FIND("'",C1)+1)+1,LEN(C1)-FIND("'",C1,FIND("'",C1)+1))/3600 (Excel2003で動作確認済)
- age_momo
- ベストアンサー率52% (327/622)
>完全自動化のためには良い関数が浮かびません・・。 作るのが一番でしょうね。 下に例を書いておきます。(かなり手抜きですが) 使い方は『ツール』⇒『マクロ』⇒『Visual Basic Editer』 editerで『挿入』⇒『標準モジュール』 で出てきた画面に貼り付けてください。 後は普通に関数として呼び出せます。(分類はユーザー定義) 最初のidoには文字列を、次のnewsに0を入れると北緯を、1を入れると東経を返します。 Function 緯度経度(ido As String, news As Boolean) As Double Dim ct As Integer Dim ct1 As Integer For ct = 1 To Len(ido) If Mid(ido, ct, 1) = "E" Or Mid(ido, ct, 1) = "W" Then Exit For Next If news Then ido = Right(ido, Len(ido) - ct + 1) Else ido = Left(ido, ct - 1) End If For ct = 2 To Len(ido) If Asc(Mid(ido, ct, 1)) < 46 Or Asc(Mid(ido, ct, 1)) > 57 Then Exit For Next 緯度経度 = Val(Mid(ido, 2, ct - 1)) For ct1 = ct + 1 To Len(ido) If Asc(Mid(ido, ct1, 1)) < 46 Or Asc(Mid(ido, ct1, 1)) > 57 Then Exit For Next 緯度経度 = 緯度経度 + Val(Mid(ido, ct + 1, ct1 - ct - 1)) / 60 + Val(Right(ido, Len(ido) - ct1)) / 3600 End Function
- Meowth
- ベストアンサー率35% (130/362)
VBでSUBを作ればすぐできますよ。
- gomibako008
- ベストアンサー率34% (16/46)
データを選んで、 メニュー「データ」→「区切り位置」で、区切り位置指定ウィザードが立ち上がります。 (1/3)元のデータの形式を「カンマやタブなどの区切り文字によって~」として、 (2/3)区切り文字で「その他」を選び、「'」としてみれば、いかがでしょうか? とりあえず、一括で処理することができます。