[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ブックを開かずにセルが日付であるかを判定する。』(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.