• 締切済み

ステータスバーに「処理中 **/**件」表示

フォルダ内に複数あるCSVファイルを一つのエクセルにまとめるマクロを検討中で ホームページで自分が作成したいマクロに似ていたものがあったので流用して考えいます。 やりたい事: フォルダ内のファイル件数をカウントしステータスバーに 「処理中 **/**件」 と全体のどれだけ処理が進んでいるか表示をしたいです 完了したら「処理 完了」に変更したいです 分からない事: 一番下の辺にある MsgBox "ファイル数は" & fc & "件です。" の中のfcが全ファイル件数が表示されるんですが そのfcを使用して 初めの方にある Application.StatusBar = "処理実行中 " & cntRec & "/" & fc & "件" の中のfcにカウントした数字が表示されません 表示する方法を教えてください Private Functionが何かあるとは思っていますが、理解できなくて・・・ '--------------------------------------------------------------------- Sub 集計マクロ()  色々処理している・・・ cntRec = cntRec + 1 Application.StatusBar = "処理実行中 " & cntRec & "/" & fc & "件" End Sub '--------------------------------------------------------------------- Private Function CSVQRY(ByRef ws As Worksheet, _  'csvからデータ読み出し? ByRef fs As String, _ ByRef rs As Range, _ ByVal sr As Long) As Long Dim cnt As Long On Error GoTo errChk With ws.QueryTables.Add(Connection:="TEXT;" & fs, _ Destination:=rs) .AdjustColumnWidth = False .TextFilePlatform = xlWindows .TextFileStartRow = sr .TextFileCommaDelimiter = True .Refresh False cnt = .ResultRange.Rows.Count .Parent.Names(.Name).Delete .Delete End With CSVQRY = cnt Exit Function errChk: CSVQRY = -1 End Function '--------------------------------------------------------------------- Private Function FDSELECT() As String 'フォルダ選択Function Dim obj As Object Dim ret As String Set obj = CreateObject("Shell.Application") _ .BrowseForFolder(0, "SelectFolder", 0) If obj Is Nothing Then Exit Function On Error Resume Next ret = obj.self.Path & "\" If Err.Number <> 0 Then ret = obj.Items.Item.Path & "\" Err.Clear End If On Error GoTo 0 Set obj = Nothing FDSELECT = ret ' 指定フォルダ内のcsv数をメッセージBoxに表示 Dim fc As Long 'ファイル数 Dim fm As String 'ファイル名 fm = Dir(ret & "\*.csv", vbNormal) Do While fm <> "" fc = fc + 1 fm = Dir() Loop MsgBox "ファイル数は" & fc & "件です。" End Function

みんなの回答

  • warpspace
  • ベストアンサー率56% (83/147)
回答No.1

「Dim fc As Long 'ファイル数」は集計マクロの外(Private Function CSVQRY かな?)で 定義されており、プロシジャ単位で初期化されるので、集計マクロにその値は引き継がれません。 「Static」で宣言するか、もっと上位のモジュール・レベル変数で定義する必要があります。

参考URL:
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_04.html
yumepapa18
質問者

お礼

ありがとうございました。 「Static」というものを勉強してみます。

関連するQ&A

  • vb.netでオブジェクトの種類を知りたい

    こんばんわ vb.netでオブジェクトの種類を知る方法はないでしょうか? 例 form上にtextbox1を配置した上で 'メインルーチン public sub main() dim ret = test(textbox1) msgbox("textbox1は" & ret & "です") endsub 'サブルーチン public function test(obj) dim ret as string 'ここでobjがtextboxかcheckboxか判別したい return ret end function このようなことが可能でしょうか? 可能なようでしたらどうすればよいかご教授お願いします。

  • CSVの読み込み処理について

    こんばんわです。 エクセルのVBAをつかってCSV形式のファイルデーターを読み込みように某サイトを参考に作成しました。 確かに読み込む事が出来たのですが、数値も文字列扱いになってしまいます。 数値処理する方法があるのでしょうか? Sub CSV_Read2() Dim FileType, Prompt As String Dim FileNamePath As Variant Dim textline, csvline() As String Dim Rowcnt, ColumNum As Integer Dim ch1 As Long FileType = "CSV ファイル (*.csv),*.csv" Prompt = "CSV File を選択してください" '操作したいファイルのパスを取得します FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 'エラーが発生したらファイルを閉じます 'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、 '色々なCSVがあるようなので入れておきます On Error GoTo CloseFile '表の行番号の初期化 1行目から読み込んだデータを入力します Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認します。 '1行読み込みます Line Input #ch1, textline 'ダブルクォーテーションを削除します 'カンマ+ダブルクォーテーションで区切られている CSV ファイルなどは '適時追加してください textline = Replace(textline, """", "") 'カンマで分離します csvline() = Split(textline, ",") '配列渡しでセルに代入 Range(Cells(Rowcnt, 1), Cells(Rowcnt, UBound(csvline()) + 1)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: 'ファイルを閉じます Close #ch1 End Sub Function SelectFileNamePath(FileType, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt) End Function Function GetItemNum(FileNamePath) As Integer Dim ch1 As Long Dim textline As String '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 Line Input #ch1, textline '1行だけ読み込みます。 Close #ch1 GetItemNum = 1 '1行中のカンマの数を数えます Do GetItemNum = GetItemNum + 1 textline = Mid(textline, InStr(textline, ",") + 1) Loop Until InStr(textline, ",") = 0 End Function

  • 現在ファイルを開いている全てのユーザー名を取得

    パソコン1に入っているアクセスファイル(accdb)に パソコン1とパソコン2で同時に開いています。 共有している状態です。 その際、現在ファイルを開いている全てのユーザー名を取得したいのですが http://okwave.jp/qa/q3589812.html を参考に ' // 標準モジュール Private Declare Function GetUserName Lib "ADVAPI32.dll" Alias "GetUserNameA" ( _     ByVal lpBuffer As String, _     ByRef nSize As Long _ ) As Long Private Const MAX_PATH As Long = 256 ' // Windows のログインユーザー名を取得する Public Function GetLoginUserName() As String   Dim sBuffer As String   sBuffer = String$(MAX_PATH, vbNullChar)   If CBool(GetUserName(sBuffer, MAX_PATH) > 0) Then     GetLoginUserName = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)   End If End Function Sub 使い方サンプル()   Dim sUserName As String      sUserName = GetLoginUserName()   MsgBox "USER: " & sUserName, vbInformation    End Sub を実行してみたのですが、それぞれ自分のユーザー名しか取得されません。 http://billyboy.blog81.fc2.com/blog-entry-157.html の Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _ (ByVal lpBuffer As String, _ nSize As Long) As Long Function GetLoginName() Dim strBuffer As String * 255, retValue As Long retValue = GetUserName(strBuffer, 255) GetLoginName = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1) End Function Sub sample() MsgBox GetLoginName() End Sub を実行しても同じです。 http://www.tsware.jp/tips/tips_013.htm も自分のユーザー名しか取得できません。 どれも標準モジュールに貼り付けました。 現在ファイルを開いているユーザー名を取得するにはどうすればいいでしょうか?

  • 引数で戻り値を取得するプログラム

    以下のように、引数で戻り値を取得するプログラムを書きたいのですが どのように書けば正しいでしょうか? VB6とVB2005の両方の書き方を教えてください。 sub kekka(byval src as string, byref dst() as string) dim ret() as string ret(0) = "abc" ret(1) = "efg" kekka = ret end sub kekka("xxx", dat() ) msgbox(dat(0)) msgbox(dat(1))

  • class を使用した時の考え方について

    趣味として、プログラミングしているレベルです。職業としての開発経験はありません。 実際の開発業務においては、どちらが一般的なのか、教えて下さい。 例として、ファイル内の行数をを取り込む場合。(Excel VBA です。) Case 1 は、メイン処理の記述数が少ないのですが、クラス内での処理がネスト化しています。 Case 2 は、メイン処理で、一々関数を呼び出していますが、クラス内の関数は、独立しています。 ■ Case 1 -----メイン-------------------------------------------------- Dim argetFile As TargetFile Dim fileRowCount As Long Set targetFile = new TargetFile fileRowCount = targetFile.rowCount("c:\", "sample.txt") Set targetFile = Nothing -----TargetFile.cls-------------------------------------------------- private myFileName As String private myFileData As Variant ' ファイルを開く Private Function openFile() 'myFileName を開く処理 End Function ' ファイル内のデータを取り込む Private Function readFile() Call openFile() myFileData = ' myFileName 内データを取り込む処理 End Function ' ファイル内の行数を取得 Public Function rowCount(pPath As String, pFileName As String) As Long myFileName = pPath & pFileName Call readFile rowCount = 'myFileData から、行数を取得する処理 End Function ------------------------------------------------------- ■ Case 2 -----メイン-------------------------------------------------- Dim targetFile As TargetFile Dim fileRowCount As Long Set targetFile = new TargetFile Call targetFile.openFile("c:\", "sample.txt") Call targetFile.readFile fileRowCount = targetFile.rowCount Set targetFile = Nothing -----TargetFile.cls-------------------------------------------------- private myFileName As String private myFileData As Variant ' ファイルを開く Public Function openFile(pPath As String, pFileName As String) myFileName = pPath & pFileName 'myFileName を開く処理 End Function ' ファイル内のデータを取り込む Public Function readFile() myFileData = ' myFileName 内データを取り込む処理 End Function ' ファイル内の行数を取得 Public Function rowCount() As Long rowCount = 'myFileData から、行数を取得する処理 End Function -------------------------------------------------------

  • エクセルの質問です。

    エクセル マクロについて質問です。 現在,以下のような記述をエクセル上のボタンに登録しています。 ボタンを押すと,デスクトップ上の任意のCSVファイルの選択を行い,CSVファイルを選択し,そのCSVデータを全てエクセル上のデータとして落としさせたいと思っています。 しかし,csvファイルによっては, 「実行時エラー  アプリケーション定義またはオブジェクト定義のエラーです。」と出て, 「デバック(D)」ボタンを押すと,下から4行目の 「Cells(i, j) = strCell」のところが,黄色くエラーとして表示されてしまいます。 下記の記述もネット上で皆さんに教えていただきながらなんとかやっているもので,正直自分自身でよく理解できていませんが,上記のようなエラーを回避する方法をどなたかご教示いただけないかと思います。 どうかよろしくお願いいたします。 Sub Macro5() Dim varFileName As Variant Dim intFree As Integer Dim strRec As String Dim strSplit() As String Dim i As Long, j As Long, k As Long Dim lngQuate As Long Dim strCell As String varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _ Title:="CSVファイルの選択") If varFileName = False Then Exit Sub End If intFree = FreeFile '空番号を取得 Open varFileName For Input As #intFree 'CSVファィルをオープン i = 0 Do Until EOF(intFree) Line Input #intFree, strRec '1行読み込み i = i + 1 j = 0 lngQuate = 0 strCell = "" For k = 1 To Len(strRec) Select Case Mid(strRec, k, 1) Case "," '「"」が偶数なら区切り、奇数ならただの文字 If lngQuate Mod 2 = 0 Then Call PutCell(i, j, strCell, lngQuate) Else strCell = strCell & Mid(strRec, k, 1) End If Case """" '「"」のカウントをとる lngQuate = lngQuate + 1 strCell = strCell & Mid(strRec, k, 1) Case Else strCell = strCell & Mid(strRec, k, 1) End Select Next '最終列の処理 Call PutCell(i, j, strCell, lngQuate) Loop Close #intFree End Sub Sub PutCell(ByRef i As Long, ByRef j As Long, ByRef strCell As String, ByRef lngQuate As Long) j = j + 1 '「""」を「"」で置換 strCell = Replace(strCell, """""", """") '前後の「"」を削除 If Left(strCell, 1) = """" And Right(strCell, 1) = """" Then strCell = Mid(strCell, 2, Len(strCell) - 2) End If Cells(i, j) = strCell strCell = "" lngQuate = 0 End Sub

  • 配列を返り値、でエラー

    Excelで、ボタンが押されるとファンクションを呼び出し、 指定した文字列を文字列型の配列に格納して返す、 というマクロを作成したいのですが ―Sheet1―――――――――――― Private Sub btn_Click() Dim inpt(3) As String inpt = Module1.getArg() End Sub ―――――――――――――――― ―Module1――――――――――― Function getArg() As String() Dim ret(3) As String ret(0) = "1番目" ret(1) = "2番目" ret(2) = "3番目" getArg = ret End Function ―――――――――――――――― inpt = Module1.getArg() の部分で「配列には割り当てできません」とエラーが出てしまいます。 色々試してはみたのですが、どうも解決できません。 ヒントだけでも構いませんのでご助力お願いします。

  • \記号が入った数値の処理について(VBA)

    はじめまして。 excel2013でcsvの読み込みをVBAで自動化させようとしています。 基となるCSVファイルに\記号が含まれておりファイルを読み込むと文字列として読まれてしまいまい、エラーインジケータが表示されます。 文字と読み込まれているので計算もできないでいます。 数値に置き換える方法として考えられる事はないでしょうか? ご教授お願いいたします。 ------------------------------- ソース Sub Read() Dim FileType, Prompt As String Dim FileNamePath As Variant Dim csvline() As String Dim i, Rowcnt, ColumNum As Integer Dim ch1 As Long FileType = "CSV ファイル (*.csv),*.csv" Prompt = "CSV File を選択してください" '操作したいファイルのパスを取得します FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '1行あたりの項目数を取得します ColumNum = GetItemNum(FileNamePath) 'csvlineを1行あたりの項目数で再割り当てます ReDim csvline(1 To ColumNum) '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 'エラーが発生したらファイルを閉じます 'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、 '色々なCSVがあるようなので入れておきます On Error GoTo CloseFile '表の行番号の初期化 1行目から読み込んだデータを入力します Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認します。 For i = 1 To ColumNum Input #ch1, csvline(i) '1行の項目数だけ読み込みます Next '配列渡しでセルに代入 この方が早い Range(Cells(Rowcnt, 1), Cells(Rowcnt, ColumNum)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: 'ファイルを閉じます Close #ch1 End Sub Function GetItemNum(FileNamePath) As Integer Dim ch1 As Long Dim textline As String '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 Line Input #ch1, textline '1行だけ読み込みます。 Close #ch1 GetItemNum = 1 '1行中のカンマの数を数えます Do GetItemNum = GetItemNum + 1 textline = Mid(textline, InStr(textline, ",") + 1) Loop Until InStr(textline, ",") = 0 End Function Function SelectFileNamePath(FileType, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt) End Function ----------------------- CSVファイル \101,\101,\101

  • VBAで画像ファイルをダウンロードしたいけどうまく

    VBAで画像ファイルをダウンロードしたいけどうまく行かない・・・ XPで、オフィス2003です。 http://officetanaka.net/other/extra/tips01.htm を参考に、画像ファイルをダウンロードする練習をしているのですが "エラーが発生しました"になってしまいます。 標準モジュールに --------------------------------------------------------- Option Explicit Public Declare Function URLDownloadToFile Lib "urlmon" _ Alias "URLDownloadToFileA" (ByVal pCaller As Long, _ ByVal szURL As String, ByVal szFileName As String, _ ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long Sub Sample() GetImageFile "http://www.officetanaka.net/sample.jpg", "C:\sample.jpg" End Sub Sub GetImageFile(ImgName As String, SaveName As String) Dim SaveFileName As String, DownloadFile As String, Ret As Long Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0) If ImgName = "" Then Exit Sub SaveFileName = SaveName DownloadFile = ImgName Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0) If Ret = 0 Then MsgBox "ダウンロードできました" Else MsgBox "エラーが発生しました" End If End Sub --------------------------------------------------------- を貼り付けました。 Retが0にならなくてはいけないみたいですが、 自分の場合は、-2147221020になってしまいます。 どう修正すればいいのか教えてください。

  • Functionで戻り値を複数返す方法

    Functionで戻り値を複数取得したいのですが うまくいきません。(NULLの使い方が不正ですとエラー) 戻り値に配列を使う場合 呼び出し側はどのように記述すればいいでしょうか? <呼び出し側> Private Sub a() wkkekka1 = 処理結果(Kensu, Houhou)(0) ⇒ ここでエラー wkkekka2 = 処理結果(Kensu, Houhou)(1) wkkekka3 = 処理結果(Kensu, Houhou)(2) End Sub <関数> Public Function 処理結果(ByRef lngKensu As Long, ByRef strHouhou As String) Dim kekka(3) As Double If lngKensu = 1000 and strHouhou = aaaaaa then kekka(0) =  0.1 kekka(1) =  2   kekka(2) =  300 Else ↓ (省略)     ↓ End If 処理結果 = kekka End Function

専門家に質問してみよう