Excel VBA質問箱 IV

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

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


44648 / 76732 ←次へ | 前へ→

【37099】Re:かなり初歩的なプログラム
回答  neptune  - 06/4/21(金) 12:51 -

引用なし
パスワード
   おまけです。

長くなりますが、ファイルの読み込み部分を関数化してます。
汎用性があるように作成してますから、使えるところがあればどうぞ。
(過去ログやWebを探せばどこにでも転がっているようなもんです。)

ファイルサイズが数十MB程度までなら問題なく実行できると思います。
(私は20MB程度までしかやったこと無いですが)
Excelの機能を使ってませんので、Accessなどでも使用できます。

但し、あえて書きませんでしたが、他の方の回答の様にSum関数を使ったほうがより合計は
早くなるような気がします。(Excel関数は速いです。)
ただ、計算回数が少ないので全体としては大きくは影響しないかもしれません。

Option Explicit
Private Sub CommandButton1_Click()

Dim strIN As String
Dim tblDatafield() As String
Dim tblDataRow() As String
Dim csvDATA As String

Dim j As Long

Dim lBuf(9) As Long
Dim goukei As Long
Dim i As Long, iEnd As Long

  'ファイルの入出力のパスを指定
  strIN = "D:\Excel\Test\test.csv"
'  strIN = ThisWorkbook.Path & "\output.csv"
  csvDATA = ReadTextFunc(strIN)
  If csvDATA = "" Then Exit Sub
  
  '行単位で分割
  tblDataRow() = Split(csvDATA, vbCrLf)
  
  iEnd = UBound(tblDataRow)
  
  For i = 2 To iEnd
    '「,」区切りでデータを区切る。配列に入れる
    If tblDataRow(i) <> "" Then
      tblDatafield() = Split(tblDataRow(i), ",")
      For j = 2 To 11
        lBuf(j - 2) = CLng(tblDatafield(j))
      Next j
      goukei = FuncGoukei(lBuf)
      Debug.Print goukei
    End If
  Next i
  Erase tblDataRow()
End Sub

'***************合計値***************
Public Function FuncGoukei(pData() As Long) As Long
  Dim i As Long
  Dim lAns As Long

  For i = 0 To UBound(pData())
    lAns = lAns + pData(i)
  Next i
  FuncGoukei = lAns
End Function

Public Function ReadTextFunc(psPath As String) As String
'*******************************************************
'テキストファイルを一気に読み込む
'**********
'引数
'psPath (String):テキストファイルのフルパス
'**********
'戻り値:テキストファイルの内容
'*******************************************************
Dim bytBuf() As Byte
Dim lFN As Long, lfLength As Long

  On Error GoTo ReadTextFunc_Error

  If Dir(psPath, vbNormal) = "" Then GoTo ReadTextFunc_Error
  
  lfLength = FileLen(psPath)
  lfLength = lfLength + 1000 '本当は必要ないと思うが念の為余分に確保
  ReDim bytBuf(lfLength)
  
  lFN = FreeFile()
  
  Open psPath For Binary As #lFN
  Get #lFN, , bytBuf
  Close #lFN
  
  ReadTextFunc = StrConv(bytBuf, vbUnicode)  '変換
  '余分な部分を切り捨てる
  ReadTextFunc = Left(ReadTextFunc, InStr(1, ReadTextFunc, Chr(0)) - 1)
  
  Erase bytBuf
  Exit Function
ReadTextFunc_Error:
  Reset
  ReadTextFunc = ""
End Function

問題解決後ですが、より早くするにはこんな方法もあるという程度で見てください。
又、他の方のResもこの機会に消化しておけば良いと思います。

最後に、
チョコチョコっと書いて殆ど検証してないので、もし、バグがあったら適当に直して下さい。
実は、一度書いて、出来た!と思って、Excelを閉じたらBookを保存してなかったんですね。
その挙句、書き直したもんで ^ ^;;;;
10 hits

【36993】かなり初歩的なプログラム ゴルゴン130 06/4/19(水) 15:36 質問
【36994】Re:かなり初歩的なプログラム neptune 06/4/19(水) 16:15 回答
【37002】Re:かなり初歩的なプログラム Blue 06/4/19(水) 17:00 発言
【36995】Re:かなり初歩的なプログラム boni 06/4/19(水) 16:19 回答
【37000】Re:かなり初歩的なプログラム Kein 06/4/19(水) 16:30 回答
【37001】Re:かなり初歩的なプログラム Blue 06/4/19(水) 16:54 発言
【37003】Re:かなり初歩的なプログラム Jaka 06/4/19(水) 17:09 発言
【37004】Re:かなり初歩的なプログラム Blue 06/4/19(水) 17:14 発言
【37005】Re:かなり初歩的なプログラム Jaka 06/4/19(水) 17:29 発言
【37006】Re:かなり初歩的なプログラム Kein 06/4/19(水) 17:50 発言
【37007】Re:かなり初歩的なプログラム Blue 06/4/19(水) 18:08 お礼
【37060】Re:かなり初歩的なプログラム ゴルゴン130 06/4/20(木) 16:14 質問
【37064】Re:かなり初歩的なプログラム Kein 06/4/20(木) 16:43 回答
【37065】Re:かなり初歩的なプログラム neptune 06/4/20(木) 16:47 回答
【37070】Re:かなり初歩的なプログラム ゴルゴン130 06/4/20(木) 17:47 質問
【37079】Re:かなり初歩的なプログラム neptune 06/4/20(木) 21:50 回答
【37089】Re:かなり初歩的なプログラム ゴルゴン130 06/4/21(金) 1:24 質問
【37093】Re:かなり初歩的なプログラム neptune 06/4/21(金) 8:29 回答
【37099】Re:かなり初歩的なプログラム neptune 06/4/21(金) 12:51 回答
【37169】Re:かなり初歩的なプログラム ゴルゴン130 06/4/24(月) 23:36 お礼
【37176】Re:かなり初歩的なプログラム neptune 06/4/25(火) 10:12 発言

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