Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12032 / 76734 ←次へ | 前へ→

【70229】Re:16桁以上の数値取得について
発言  ichinose  - 11/10/20(木) 22:30 -

引用なし
パスワード
   こんばんは。

本当はね、サンプルデータは、この命題用に初心者さんが用意するのですよ!!

新規ブックにて、

標準モジュール(Module1)にサンプル作成プロシジャー

'=======================================================
Sub mk_sample_csv()
  Dim fno As Long
  fno = FreeFile()
  Open ThisWorkbook.path & "\csvtest.csv" For Output As #fno
  Print #fno, "12345678901234567890,ichinose-A"
  Print #fno, "12345678901234567891,ichinose-B"
  Print #fno, "12345678901234567892,ichinose-C"
  Close #fno
End Sub

** 最初に上記のコードをコピーして、一度適当なフォルダに保存してください
↑これ重要

保存後に、上記のmk_sample_csvを実行してください。
VBAコードを含んだブックと同じフォルダ上に csvtest.csv というファイルが作成されます。

中身は、
12345678901234567890,ichinose-A
12345678901234567891,ichinose-B
12345678901234567892,ichinose-C

こんなcsvファイルです。

このファイルを 初心者さんが提示されたコードを参考にした

'===============================================
Sub test1()
  Dim con As Object
  Dim rs As Object
  Set con = CreateObject("adodb.connection")
  Set rs = CreateObject("adodb.recordset")
  Dim connectionString As String
  connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & ThisWorkbook.path & "\" & ";" & "Extended Properties=""Text;HDR=NO;FMT=Delimited"""
  con.Open connectionString
  Set rs = con.Execute _
  ("SELECT * FROM csvtest.csv;")

  Range("a1").CopyFromRecordset rs
  rs.Close
  con.Close
End Sub

上記のtest1を実行すると、アクティブシートのA列の書式を文字列にしても
  A        B
1 1.23457E+19  ichinose-A
2 1.23457E+19  ichinose-B
3 1.23457E+19  ichinose-C

このように表示されてしまいます。

同ブックの別の標準モジュール(Module2)にAdoでテキスト操作関連プロシジャー群
忘れるほど前に作っておいたやつ(仕事では、使ったことがない)。

Option Explicit
'=============================================================
Private cn As Object
'=============================================================
Function open_ado_text(path As String) As Long 'adoでテキストにアクセス
  On Error Resume Next
  Dim link_opt As String
  Set cn = CreateObject("adodb.connection")
  link_opt = "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
         "DBQ=" & path & ";" & "ReadOnly=0"

  cn.Open link_opt
  open_ado_text = Err.Number
  On Error GoTo 0
End Function
'=============================================================
Sub close_ado()  'クローズ
  On Error Resume Next
  cn.Close
  On Error GoTo 0
End Sub
'=============================================================
Function exec_sql(sql_str, rs As Object) As Long 'Sqlの実行
  On Error Resume Next
  Set rs = cn.Execute(sql_str)
  exec_sql = Err.Number
  If Err.Number <> 0 Then MsgBox Err.Description
  On Error GoTo 0
End Function
'==========================================================================
Function mk_schema_ini(path As String, dat() As String) As Long 'schema.iniの作成
  On Error GoTo err_mk_schema_ini
  Dim fno As Long
  Dim didx As Long
  mk_schema_ini = 0
  fno = FreeFile()
  Open path & "\schema.ini" For Output As #fno
  For didx = LBound(dat()) To UBound(dat())
    Print #fno, dat(didx)
    Next
  Close #fno
ret_mk_schema_ini:
  On Error GoTo 0
  Exit Function
err_mk_schema_ini:
  MsgBox Err.Description
  mk_schema_ini = Err.Number
  Resume ret_mk_schema_ini
End Function
'=============================================================
Function del_schema_ini(path As String) 'schema_iniの削除
  On Error Resume Next
  Kill path & "\schema.ini"
  On Error GoTo 0
End Function


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

'=================================================================
Sub main()
  Dim ret As Long
  Dim dat(1 To 6) As String
  Dim rs As Object
  Dim ans As Variant
  dat(1) = "[csvtest.csv]"
  dat(2) = "ColNameHeader = False"
  dat(3) = "CharacterSet = oem"
  dat(4) = "Format = CSVDelimited"
  dat(5) = "Col1=f1 char width 255"
  dat(6) = "Col2=f2 char width 255"
  Call mk_schema_ini(ThisWorkbook.path, dat())
  ret = open_ado_text(ThisWorkbook.path)
  If ret = 0 Then
    ret = exec_sql("select * from csvtest.csv;", rs)
    If ret = 0 Then
     With ActiveSheet
       .Columns(1).NumberFormatLocal = "@"
       .Range("a1").CopyFromRecordset rs
     End With
     rs.Close
    Else
     MsgBox Error(ret)
     End If
    close_ado
    End If
  Call del_schema_ini(ThisWorkbook.path)
End Sub


これでmainを実行してみてください。
今度は、全部の数字が表示されるはずです。


要は、schema.iniというファイルに各フィールドの型を規定してやる方法です。

表示された数字を計算に使いたいなら、Cdec関数で、10進型に変換して計算してください。


ここでは、初心者さんより、VBAの知識のない方でも
初心者さんが抱えている問題にまで到達できる記述を心がけてみてください。
↑これをすることは、間違いなく役に立ちます、プログラミングには・・。
5 hits

【70201】16桁以上の数値取得について 初心者 11/10/19(水) 12:47 質問
【70219】Re:16桁以上の数値取得について ichinose 11/10/19(水) 21:54 発言
【70224】Re:16桁以上の数値取得について 初心者 11/10/20(木) 14:42 発言
【70229】Re:16桁以上の数値取得について ichinose 11/10/20(木) 22:30 発言
【70233】Re:16桁以上の数値取得について 訂正 ichinose 11/10/21(金) 6:56 発言
【70268】Re:16桁以上の数値取得について 訂正 初心者 11/10/25(火) 16:18 お礼

12032 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free