[[20111205114113]] 『ブックを開かずにセルが日付であるかを判定する。』(setcom) ページの最後に飛ぶ

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

 

『ブックを開かずにセルが日付であるかを判定する。』(setcom)
 ブックを開かずに、c:\[test.xls]sheet1'!R1C1のセルの値は、
 MsgBox Application.ExecuteExcel4Macro("'c:\[test.xls]sheet1'!R1C1")
 これで取得出来ましたが、

 IsDate関数で、このセルか日付であるかを知りたいので、
 MsgBox Application.ExecuteExcel4Macro("IsDate('c:\[test.xls]sheet1'!R1C1)")
 こうしてみましたが、型が一致しないと言われます。
 方法はあるでしょうか?

 ExecuteExcel4Macro は値しか取得できず、書式は参照できないようです。
http://www.moug.net/tech/exvba/0060037.html
 (Mook)

 「ブックを開かず」という要望はしゅっちゅう目にするけど、なぜかな?
かっこいいから?それとも、「きっと処理スピードが早いだろう」?
後者は、ケースによっては、(Mookさんが紹介されたページにも説明があるように)逆に遅くなることもある。

 普通に
Application.ScreenUpdating = False
ブックを開く
セルから値を取得する
ブックを閉じる
Application.ScreenUpdating = True

 これで、全く問題が無いと思うけどね。

 ただ、どうしてもということなら、いったんVariant型変数に値を取り込んで
その値を評価するということはできる。ただ、紹介ページにもあるように
日付であればDouble型のシリアル値、つまり、通常の数値と区別がつかない形。
これをどう扱うか、ここは悩むところだね。そこが「日付」だったか「数値」だったかは
「神のみぞ知る」なので。

 (ぶらっと)

 「下手な考え休むに似たり」かな。
 ぶらっとさん案に一票。
 (Mook)

なるほどです。
 そうです、処理がさぞかし早いだろうと思うわけです。
 欲しい場所が決まってるので、開いたり閉じたりと
 やらなくていいので、便利に感じました。
 大変有り難う御座いました。
 (setcom)

 解決後ですが・・・、私も原則として、

 ブックをOpen---->取得したいセルの取得---->ブックのCloseで殆ど
 事足りると思っています。が、情報として・・・、ADOを使えば・・・。

 新規ブックにて・・・、

 標準モジュール(Module1)にExcel_Ado関連プロシジャー

 '================================================================
 Option Explicit
 '================================================================
 Private cn As Object
 '================================================================
 Function open_ado_excel(book_fullname As String) As Long
 'ADOでExcelブックに接続
    Dim link_opt As String
    On Error Resume Next
    link_opt = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & book_fullname & ";" & _
              "Extended Properties='Excel 8.0; HDR=No'"
    Set cn = CreateObject("ADODB.Connection")
    cn.Open link_opt
    open_ado_excel = Err.Number
    On Error GoTo 0
 End Function
 '===========================================================
 Sub close_ado()
 'ADOでの接続解除
    On Error Resume Next
    cn.Close
    Set cn = Nothing
    On Error GoTo 0
 End Sub
 '===========================================================
 Function get_exec_sql(sql_str, rs As Object) As Long
 'SQLでレコードセット取得
    On Error Resume Next
    Set rs = cn.Execute(sql_str)
    get_exec_sql = Err.Number
    On Error GoTo 0
 End Function

 別の標準モジュール(Module2)に

 '============================================================
 Function getoutrng(ByVal bkpath As String, ByVal shtnm As String, ByVal rng As Range) As Variant
    '指定されたブックから単一セルの内容を取得する
    Dim sql As String
    Dim radd As String
    Dim rs As Object
    getoutrng = [na()]
    If open_ado_excel(bkpath) = 0 Then
       If InStr(rng.Address(False, False), ":") = 0 Then
          radd = rng.Address(False, False) & ":" & rng.Address(False, False)
       Else
          radd = rng.Cells(1).Address(False, False) & ":" & rng.Cells(1).Address(False, False)
       End If
       sql = "SELECT * FROM [" & shtnm & "$" & radd & "]"
       If get_exec_sql(sql, rs) = 0 Then
          getoutrng = rs.fields(0).Value
          On Error Resume Next
          rs.Close
          On Error GoTo 0
          Call close_ado
          Set rs = Nothing
       End If
    End If
 End Function

 別の標準モジュール(Module3)に

 '==========================================================
 Option Explicit
 Sub mk_sample_bk()
    With Workbooks.Add.Worksheets(1)
       .Range("a1").Value = Now()
       .Range("a2").Value = CDbl(Now())
       .Range("a3").Value = "'" & CStr(Now())
       With .Parent
          .SaveAs ThisWorkbook.Path & "\sample.xls"
          .Close False
       End With
    End With
 End Sub
 '=================================================================
 Sub chk_range()
    Dim ans As Variant
    ans = getoutrng(ThisWorkbook.Path & "\sample.xls", "Sheet1", Range("a1"))
    MsgBox TypeName(ans)
    ans = getoutrng(ThisWorkbook.Path & "\sample.xls", "Sheet1", Range("a2"))
    MsgBox TypeName(ans)
    ans = getoutrng(ThisWorkbook.Path & "\sample.xls", "Sheet1", Range("a3"))
    MsgBox TypeName(ans)
 End Sub

コードは以上です。コードの実行は必ず、適当な名前で保存してから行ってください。

 まず、mk_sample_bkを実行してサンプルブックを作成してください。

 Sheet1のA1には、日付  A2には、Double型の数値、A3には、日付の形をした文字列
 が、入力された sample.xlsが作成されます。

 chk_rangeを実行してください。sample.xlsをブックとしてExcelでは、開かずに
 Sheet1のセルA1,A2,A3のデータの型を表示しています。

 このようにADOを使うと型の取得も可能ですが・・・、
 ADOにも問題点がないわけではありません。
 それは、色々試してみるとわかりますから、興味があるなら、試してみてください

 ichinose


コメント返信:

[ 一覧(最新更新順) ]


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