| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Excel VBA File Utility」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の4版が非表示)
1行目: 1行目:
==Excel VBA File Utility==
+
==[[Excel VBA File Utility]]==
[[Excel VBA]] | {{category VBAソース片}}
+
[[Excel VBA]] | [[Category:VBAソース片]]
  
 
==='''FileUtil.cls'''===
 
==='''FileUtil.cls'''===
76行目: 76行目:
 
  ' @return データがこれ以上ない場合False
 
  ' @return データがこれ以上ない場合False
 
  '
 
  '
  Public Function readLine(ByRef line As String) As Boolean
+
  Public Function readLine(By[[R]]ef line As String) As Boolean
 
          
 
          
 
     Dim ret As Boolean
 
     Dim ret As Boolean
179行目: 179行目:
 
     AppendMode = &H3&
 
     AppendMode = &H3&
 
  End Enum
 
  End Enum
 +
 +
===UTF-8 に対応===
 +
<pre>
 +
Option Explicit
 +
'********************************************
 +
'
 +
'
 +
'    ファイルユーティリティクラス
 +
'      File関連のオブジェクト(ADODB.Stream)をラップ
 +
'
 +
'
 +
'      @see https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/stream-object-ado
 +
'
 +
'
 +
'********************************************
 +
 +
Private Const INVALID_FILENO As Integer = -1
 +
 +
Private stream As Object
 +
 +
Private Const adTypeText = 2
 +
 +
Private Const adModeRead = 1
 +
Private Const admodewrite = 2
 +
Private Const adModeReadWrite = 3
 +
 +
Private Const adStateClosed = 0
 +
Private Const adReadLine = -2
 +
Private Const adCR = 13
 +
Private Const adSaveCreateOverWrite = 2
 +
 +
' 処理対象のファイル名を保持
 +
Private m_Filename  As String
 +
 +
' 処理中のファイル番号を保持
 +
Private m_FileNo    As Integer
 +
 +
Private m_FileMode As FileMode
 +
 +
 +
'
 +
' 初期化
 +
'
 +
Private Sub Class_Initialize()
 +
   
 +
    Set stream = CreateObject("ADODB.Stream")
 +
   
 +
    'Call setFileNo(INVALID_FILENO)
 +
 +
End Sub
 +
 +
'
 +
' 終了処理
 +
'
 +
Private Sub Class_Terminate()
 +
 +
    Call closeFile
 +
 +
    Set stream = Nothing
 +
 +
End Sub
 +
'
 +
' ファイルが開かれているか
 +
'
 +
Public Function isOpen() As Boolean
 +
    ' https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/state-property-ado?view=sql-server-ver15
 +
    'isOpen = (getFileNo > 0)
 +
   
 +
    isOpen = (stream.State <> adStateClosed)
 +
 +
End Function
 +
'
 +
' ファイルを開く
 +
'
 +
Public Function openFile(fileName As String, mode As FileMode) As Boolean
 +
    On Error GoTo errHandler
 +
   
 +
    Dim isAppend As Boolean
 +
   
 +
    isAppend = False
 +
    openFile = True
 +
   
 +
    stream.Charset = CHAR_SET
 +
    stream.Type = adTypeText
 +
   
 +
    'https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/lineseparator-property-ado
 +
    stream.LineSeparator = adCR
 +
   
 +
    Call setFilename(fileName)
 +
    'Call setFileNo(FreeFile)
 +
    m_FileMode = mode
 +
   
 +
    Select Case mode
 +
        Case FileMode.InputMode
 +
            'Open getFilename For Input As getFileNo
 +
            stream.mode = adModeReadWrite
 +
            stream.Open
 +
            stream.LoadFromFile fileName
 +
           
 +
        Case FileMode.OutputMode
 +
            'Open getFilename For Output As getFileNo
 +
            stream.mode = adModeReadWrite
 +
            stream.Position = 0
 +
            stream.Open
 +
        Case FileMode.AppendMode
 +
            'Open getFilename For Append As getFileNo
 +
            stream.mode = adModeReadWrite
 +
            'stream.SetEOS = True
 +
            stream.Open
 +
        Case Else
 +
            openFile = False
 +
    End Select
 +
   
 +
    Exit Function
 +
errHandler:
 +
    openFile = False
 +
    Debug.Print Err.Number & ":" & Err.Description
 +
   
 +
End Function
 +
'
 +
' ファイルから1行読込む
 +
'
 +
Public Function readLine(ByRef line As String) As Boolean
 +
       
 +
    Dim ret As Boolean
 +
   
 +
    ret = Not isEOF()
 +
   
 +
    If ret Then
 +
        'Line Input #getFileNo(), line
 +
       
 +
        line = stream.ReadText(adReadLine)
 +
       
 +
    End If
 +
   
 +
    readLine = ret
 +
   
 +
End Function
 +
'
 +
' ファイルがEOFに達しているか
 +
'
 +
Public Function isEOF() As Boolean
 +
 +
    'isEOF = EOF(getFileNo())
 +
    isEOF = stream.EOS
 +
   
 +
End Function
 +
'
 +
' 1行出力
 +
'
 +
Public Sub println(str As String)
 +
 +
    'Print #getFileNo(), str
 +
    stream.writeText str
 +
   
 +
   
 +
End Sub
 +
'
 +
' ファイルを閉じる
 +
'
 +
Public Sub closeFile()
 +
   
 +
    'Close getFileNo()
 +
    If isOpen() Then
 +
   
 +
       
 +
        Select Case m_FileMode
 +
            Case FileMode.InputMode
 +
               
 +
            Case FileMode.OutputMode
 +
                Call stream.SaveToFile(m_Filename, adSaveCreateOverWrite)
 +
            Case FileMode.AppendMode
 +
                Call stream.SaveToFile(m_Filename, adSaveCreateOverWrite)
 +
            Case Else
 +
        End Select
 +
   
 +
   
 +
        stream.Close
 +
    End If
 +
 +
End Sub
 +
 +
'
 +
' ファイル名の設定
 +
'
 +
Private Sub setFilename(newVal As String)
 +
 +
    m_Filename = newVal
 +
 +
End Sub
 +
'
 +
' ファイル名の取得
 +
'
 +
Public Function getFilename() As String
 +
 +
    getFilename = m_Filename
 +
 +
End Function
 +
'
 +
' ファイルNoの設定
 +
'
 +
Private Sub setFileNo(newVal As Integer)
 +
 +
    m_FileNo = newVal
 +
 +
End Sub
 +
'
 +
' ファイルNoの取得
 +
'
 +
Public Function getFileNo() As Integer
 +
 +
    getFileNo = m_FileNo
 +
 +
End Function
 +
 +
</pre>
 +
  
 
{{ref FileUtil.cls}}
 
{{ref FileUtil.cls}}

2021年9月26日 (日) 10:44時点における最新版

Excel VBA File Utility

Excel VBA |

FileUtil.cls

  1. Option Explicit
  2.  
  3. Private Const INVALID_FILENO As Integer = -1
  4.  
  5. ' 処理対象のファイル名を保持
  6. Private m_Filename As String
  7.  
  8. ' 処理中のファイル番号を保持
  9. Private m_FileNo As Integer
  10. '
  11. ' 初期化
  12. '
  13. Private Sub Class_Initialize()
  14. Call setFileNo(INVALID_FILENO)
  15.  
  16. End Sub
  17.  
  18. '
  19. ' 終了処理
  20. '
  21. Private Sub Class_Terminate()
  22.  
  23. Call closeFile
  24.  
  25. End Sub
  26. '
  27. ' ファイルが開かれているか
  28. '
  29. ' @return 開かれていれば True
  30. '
  31. Public Function isOpen() As Boolean
  32.  
  33. isOpen = (getFileNo > 0)
  34.  
  35. End Function
  36. '
  37. ' ファイルを開く
  38. '
  39. ' @param fileName
  40. ' @param mode
  41. ' @return 成功した場合True
  42. '
  43. Public Function openFile(fileName As String, mode As FileMode) As Boolean
  44. On Error GoTo errHandler
  45. openFile = True
  46. Call setFilename(fileName)
  47. Call setFileNo(FreeFile)
  48. Select Case mode
  49. Case FileMode.InputMode
  50. Open getFilename For Input As getFileNo
  51. Case FileMode.OutputMode
  52. Open getFilename For Output As getFileNo
  53. Case FileMode.AppendMode
  54. Open getFilename For Append As getFileNo
  55. Case Else
  56. openFile = False
  57. End Select
  58. Exit Function
  59. errHandler:
  60. openFile = False
  61. End Function
  62. '
  63. ' ファイルから1行読込む
  64. '
  65. ' @param line 読み込んだ行を格納
  66. ' @return データがこれ以上ない場合False
  67. '
  68. Public Function readLine(ByRef line As String) As Boolean
  69. Dim ret As Boolean
  70. ret = Not isEOF()
  71. If ret Then
  72. Line Input #getFileNo(), line
  73. End If
  74. readLine = ret
  75. End Function
  76. '
  77. ' ファイルがEOFに達しているか
  78. '
  79. ' @return ファイルがEOFに達している場合True
  80. '
  81. Public Function isEOF() As Boolean
  82.  
  83. isEOF = EOF(getFileNo())
  84. End Function
  85. '
  86. ' 出力(改行しない)
  87. '
  88. ' @param str 出力内容
  89. '
  90. Public Sub print_(str As String)
  91.  
  92. Print #getFileNo(), str;
  93.  
  94. End Sub
  95. '
  96. ' 1行出力
  97. '
  98. ' @param str 出力内容
  99. '
  100. Public Sub println(str As String)
  101.  
  102. Print #getFileNo(), str
  103.  
  104. End Sub
  105. '
  106. ' ファイルを閉じる
  107. '
  108. Public Sub closeFile()
  109. Close getFileNo()
  110.  
  111. End Sub
  112.  
  113. '
  114. ' ファイル名の設定
  115. '
  116. ' @param newFileName
  117. '
  118. '
  119. Private Sub setFilename(newFileName As String)
  120.  
  121. m_Filename = newFileName
  122.  
  123. End Sub
  124. '
  125. ' ファイル名の取得
  126. '
  127. ' @param ファイル名
  128. '
  129. Public Function getFilename() As String
  130.  
  131. getFilename = m_Filename
  132.  
  133. End Function
  134. '
  135. ' ファイルNoの設定
  136. '
  137. ' @param ファイルNo
  138. '
  139. Private Sub setFileNo(newFileNo As Integer)
  140.  
  141. m_FileNo = newFileNo
  142.  
  143. End Sub
  144. '
  145. ' ファイルNoの取得
  146. '
  147. ' @return ファイルNo
  148. '
  149. Public Function getFileNo() As Integer
  150.  
  151. getFileNo = m_FileNo
  152.  
  153. End Function
標準モジュールに
  1. '----------------
  2. 'ファイルモード
  3. '----------------
  4. Public Enum FileMode
  5. InputMode = &H1&
  6. OutputMode = &H2&
  7. AppendMode = &H3&
  8. End Enum

UTF-8 に対応

  1. Option Explicit
  2. '********************************************
  3. '
  4. '
  5. ' ファイルユーティリティクラス
  6. ' File関連のオブジェクト(ADODB.Stream)をラップ
  7. '
  8. '
  9. ' @see https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/stream-object-ado
  10. '
  11. '
  12. '********************************************
  13.  
  14. Private Const INVALID_FILENO As Integer = -1
  15.  
  16. Private stream As Object
  17.  
  18. Private Const adTypeText = 2
  19.  
  20. Private Const adModeRead = 1
  21. Private Const admodewrite = 2
  22. Private Const adModeReadWrite = 3
  23.  
  24. Private Const adStateClosed = 0
  25. Private Const adReadLine = -2
  26. Private Const adCR = 13
  27. Private Const adSaveCreateOverWrite = 2
  28.  
  29. ' 処理対象のファイル名を保持
  30. Private m_Filename As String
  31.  
  32. ' 処理中のファイル番号を保持
  33. Private m_FileNo As Integer
  34.  
  35. Private m_FileMode As FileMode
  36.  
  37.  
  38. '
  39. ' 初期化
  40. '
  41. Private Sub Class_Initialize()
  42. Set stream = CreateObject("ADODB.Stream")
  43. 'Call setFileNo(INVALID_FILENO)
  44.  
  45. End Sub
  46.  
  47. '
  48. ' 終了処理
  49. '
  50. Private Sub Class_Terminate()
  51.  
  52. Call closeFile
  53.  
  54. Set stream = Nothing
  55.  
  56. End Sub
  57. '
  58. ' ファイルが開かれているか
  59. '
  60. Public Function isOpen() As Boolean
  61. ' https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/state-property-ado?view=sql-server-ver15
  62. 'isOpen = (getFileNo > 0)
  63. isOpen = (stream.State <> adStateClosed)
  64.  
  65. End Function
  66. '
  67. ' ファイルを開く
  68. '
  69. Public Function openFile(fileName As String, mode As FileMode) As Boolean
  70. On Error GoTo errHandler
  71. Dim isAppend As Boolean
  72. isAppend = False
  73. openFile = True
  74. stream.Charset = CHAR_SET
  75. stream.Type = adTypeText
  76. 'https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/lineseparator-property-ado
  77. stream.LineSeparator = adCR
  78. Call setFilename(fileName)
  79. 'Call setFileNo(FreeFile)
  80. m_FileMode = mode
  81. Select Case mode
  82. Case FileMode.InputMode
  83. 'Open getFilename For Input As getFileNo
  84. stream.mode = adModeReadWrite
  85. stream.Open
  86. stream.LoadFromFile fileName
  87. Case FileMode.OutputMode
  88. 'Open getFilename For Output As getFileNo
  89. stream.mode = adModeReadWrite
  90. stream.Position = 0
  91. stream.Open
  92. Case FileMode.AppendMode
  93. 'Open getFilename For Append As getFileNo
  94. stream.mode = adModeReadWrite
  95. 'stream.SetEOS = True
  96. stream.Open
  97. Case Else
  98. openFile = False
  99. End Select
  100. Exit Function
  101. errHandler:
  102. openFile = False
  103. Debug.Print Err.Number & ":" & Err.Description
  104. End Function
  105. '
  106. ' ファイルから1行読込む
  107. '
  108. Public Function readLine(ByRef line As String) As Boolean
  109. Dim ret As Boolean
  110. ret = Not isEOF()
  111. If ret Then
  112. 'Line Input #getFileNo(), line
  113. line = stream.ReadText(adReadLine)
  114. End If
  115. readLine = ret
  116. End Function
  117. '
  118. ' ファイルがEOFに達しているか
  119. '
  120. Public Function isEOF() As Boolean
  121.  
  122. 'isEOF = EOF(getFileNo())
  123. isEOF = stream.EOS
  124. End Function
  125. '
  126. ' 1行出力
  127. '
  128. Public Sub println(str As String)
  129.  
  130. 'Print #getFileNo(), str
  131. stream.writeText str
  132. End Sub
  133. '
  134. ' ファイルを閉じる
  135. '
  136. Public Sub closeFile()
  137. 'Close getFileNo()
  138. If isOpen() Then
  139. Select Case m_FileMode
  140. Case FileMode.InputMode
  141. Case FileMode.OutputMode
  142. Call stream.SaveToFile(m_Filename, adSaveCreateOverWrite)
  143. Case FileMode.AppendMode
  144. Call stream.SaveToFile(m_Filename, adSaveCreateOverWrite)
  145. Case Else
  146. End Select
  147. stream.Close
  148. End If
  149.  
  150. End Sub
  151.  
  152. '
  153. ' ファイル名の設定
  154. '
  155. Private Sub setFilename(newVal As String)
  156.  
  157. m_Filename = newVal
  158.  
  159. End Sub
  160. '
  161. ' ファイル名の取得
  162. '
  163. Public Function getFilename() As String
  164.  
  165. getFilename = m_Filename
  166.  
  167. End Function
  168. '
  169. ' ファイルNoの設定
  170. '
  171. Private Sub setFileNo(newVal As Integer)
  172.  
  173. m_FileNo = newVal
  174.  
  175. End Sub
  176. '
  177. ' ファイルNoの取得
  178. '
  179. Public Function getFileNo() As Integer
  180.  
  181. getFileNo = m_FileNo
  182.  
  183. End Function
  184.  


テンプレート:Ref FileUtil.cls