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

例えば以下のように文字数がバラバラの
60進法で表された緯度経度の情報があったとします。

N34'17'31.03E135'16'32.96
N34'17'44.06E135'31'18.5
N35'20'44.67E135'7'3.66
N34'57'25.71E135'57'41.48
N34'57'25.71E135'57'41.48
N35'4'59.77E135'3'2.91
N34'48'55.77E134'43'41.06

これを一括で変換し、10進法で表したいのです。
文字数がバラバラなので、条件としては区切り文字である
'を利用して変換するしかないと思っています。

(例)10進法にする計算~手動ならば~
N35'4'59.77E135'3'2.91
ならば、手動でするには
N35'4'59.77=35+(4/60)+(59.77/3600)
E135'3'2.91=135+(3/60)+(2.91/3600)

で導かれます。手動では文字数関係なく
'区切りで計算できるので、このような簡単なエクセル計算で
成り立ちます。が、大量にある場合はそれも時間がかかり
厳しい状況です。完全自動化のためには良い関数が浮かびません・・。

どうかご教授くださいませ。
'がPointである事はわかっているのですが。。

A 回答 (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で動作確認済)
    • good
    • 0

>完全自動化のためには良い関数が浮かびません・・。



作るのが一番でしょうね。
下に例を書いておきます。(かなり手抜きですが)
使い方は『ツール』⇒『マクロ』⇒『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
    • good
    • 0

VBでSUBを作ればすぐできますよ。

    • good
    • 0

データを選んで、


メニュー「データ」→「区切り位置」で、区切り位置指定ウィザードが立ち上がります。
(1/3)元のデータの形式を「カンマやタブなどの区切り文字によって~」として、
(2/3)区切り文字で「その他」を選び、「'」としてみれば、いかがでしょうか?

とりあえず、一括で処理することができます。
    • good
    • 0

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