[[20190226155306]] 『データの変換(60進数から10進数)』(ねぎ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『データの変換(60進数から10進数)』(ねぎ)

データの変換についての質問です。
複数のエクセルファイルにある緯度、経度データ取得し、一つのシートにまとめたいのですが、取得元には60進数で緯度経度が入力されており、それを10進数に変換して値を取得したいのですが、どう書けばよいでしょうか。

例えば緯度が
355555.9(60進数)の場合は35.93219444444444になると思います。
上2桁+中2桁/60+下2桁と少数点以下/3600

■データ取得イメージ
.Range("A" & i).Value(取得先) = sh2.Range("A1").Value(取得元)
.Range("B" & i).Value (取得先)= sh2.Range("A2").Value(取得元)

.Range("A" & i).Value(取得先)と.Range("B" & i).Value (取得先)を10進数に変換したいです。

諸事情でまとめ先にエクセル関数で式を書くことはできず、マクロ内で変換したいです。

< 使用 Excel:Office365、使用 OS:Windows10 >


上2桁はダメですよね。日本の経度は3桁になりますもん。

こんな感じで如何でしょうか。

    Sub サンプル()

        Dim 度分秒 As String
        度分秒 = Format(Range("A1").Value, "0000000.0000")

        Dim 度 As String, 分 As String, 秒 As String
        度 = Left(度分秒, 3)
        分 = Mid(度分秒, 4, 2)
        秒 = Right(度分秒, Len(度分秒) - 5)

        Dim 実数 As Double
        実数 = 度 + 分 / 60 + 秒 / 3600
        MsgBox 実数

    End Sub

(ななし) 2019/02/26(火) 16:15


単純な割り算と足し算なので、数式の場合と同じように計算するだけでしょう。
ななしさんの指摘で、度は3桁があると気づいたので、以下。
 Sub test()
    Dim cw As String
    Dim dw As Double

    cw = Format(Range("A1"), "0000000.0000")
    dw = Mid(cw, 1, 3) * 1 + Mid(cw, 4, 2) / 60 + Mid(cw, 6) / 3600
    MsgBox dw, vbInformation
 End Sub
(???) 2019/02/26(火) 16:38

 [TEXT(A1,"0"":""00"":""00.00")*24]
 なんてのはどうだろうか?
(ねむねむ) 2019/02/26(火) 16:55

皆様たくさんご回答ありがとうございます。
???さんのをためしたところ
 cw = Format(Range("A1"), "0000000.0000")で
型が一致しませんと出ました。
Dim cw As Stringをsingleやdoubleに変えましたが同じエラーが出ました。

初心者レベルで本当に申し訳ないですが、どうすればよいのでしょうか。。

ほかの方の回答も試させていただきますね!!
(ねぎ) 2019/02/26(火) 17:21


A1セルには、元となる数値「355555.9」等が入力されている前提ですが、空欄のまま、または数値以外を入力してから実行していないでしょうか?
(???) 2019/02/26(火) 17:42

実際には、
sh2.Range("B6")に355555.9が入力されております。
ただ、セルの表示設定で、
35度55分55.9秒
となっておりますが、関係ありますでしょうか(ユーザ定義の表示設定です)。

■以下私環境のコードです
.Range("BU" & i).Value = sh2.Range("B6").Value

 cw = Format(Range("BU" & i), "0000000.0000")
dw = Mid(cw, 1, 3) * 1 + Mid(cw, 4, 2) / 60 + Mid(cw, 6) / 3600
MsgBox dw, vbInformation
(ねぎ) 2019/02/26(火) 18:23

>ただ、セルの表示設定で、 35度55分55.9秒 となっております
であれば、
・回答者が検証できるようにセルの書式設定の内容を書いて頂けないでしょうか。
・何もしてない状態で動くのか試して頂けないでしょうか。
・本当に355555.9でしょうか。文字列で先頭にスペースが入っていたり全角小数点だったりしませんか。
・Msgbox Range("BU" & i).Valueとしたらちゃんと「355555.9」と表示されますか?

(ななし) 2019/02/26(火) 19:26


セルの書式って、「##0"度"00"分"00.0"秒"」とかですかね? でも、セルの値を使っていたので、表示がどうなっていても関係ないです。

そして、sh2 と i って何ですか? 変数を書くなら、その宣言部分と代入部分を省略せず、全て書いてください。 そうやって小出しにしたり、省略すると、誤解の元です。 そして、多くの場合、質問者が省略した部分にこそ、原因があったりします。(関係ないと思って省略するのでしょうけど、関係あると思っている部分には原因が無いから、自分で見つけられなかった、という感じ)

数字を文字列変換するとエラーだというなら、以下を試してみてください。 数値でない場合は0になります。

 Sub test2()
    Dim sh2 As Worksheet
    Dim vw As Variant
    Dim dw As Double

    Set sh2 = Sheets("Sheet2")

    vw = Split(Format(sh2.Range("B6").Value, "##0|00|00.0"), "|")
    If 1 < UBound(vw) Then
        dw = vw(0) * 1 + vw(1) / 60 + vw(2) / 3600
    End If
    MsgBox dw, vbInformation, sh2.Name
 End Sub
(???) 2019/02/27(水) 10:24

 関数化してみました。
 Function Conv10(val60)
    Dim val1, val2, val3
    Dim tmp1, tmp2
    With WorksheetFunction
        tmp1 = .RoundDown(val60, -2)
        tmp2 = .RoundDown(tmp1, -4)
        val1 = (val60 - tmp1) / 3600
        val2 = (tmp1 - tmp2) / 100 / 60
        val3 = tmp2 / 10000
        Conv10 = .Sum(val1, val2, val3)
    End With
 End Function
(ろっくん) 2019/02/27(水) 17:14

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.