以下のコードを実行する度に、カウンター i の値がリセット(開放)されずに積算されて困っています。なぜか教えて下さい。宜しくお願い致します。
以下のコードは、簡単に言えばcsvファイルをカウンター i で数えています。したがって、少なくともCSVファイルを一つ作成して実行して下さい。
Option Explicit
Dim FiName As String, FoName As String
Dim EachFiName As String
Dim i As Integer
Sub Test()
MsgBox i '二回目にこのコードを実行するとiが積算されます。
FiName = Application.GetOpenFilename
If FiName = "False" Then
Exit Sub
Else
If Right(FiName, 3) <> "csv" Then
MsgBox "Chose a CSV file."
Exit Sub
End If
End If
FoName = Left(FiName, InStrRev(FiName, "\", -1, vbTextCompare))
EachFiName = Dir(FoName & "*.csv")
Do While EachFiName <> ""
i = i + 1
EachFiName = Dir()
Loop
End Sub
No.6
- 回答日時:
こんばんは。
理屈抜きに、i は、ローカル変数のカウンターだと考えて、モジュールレベル変数にしないのが、ふつうではありませんか?もし、残したかったら、別の変数に渡します。
それから、EachFiName,FiName,FoNameも、同じく、使用状況からするとローカル変数のようです。最終値が決まったら、必要に応じて、別のスコープの長い変数に渡します。
最初の、GetOpenFilename は、一応、こういうことでしょう。
FiName = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv")
If FiName = "False" Then
Exit Sub
End If
>したがって、少なくともCSVファイルを一つ作成して実行して下さい。
なければ、CSVは、0 と出なくてはならないと思います。
だから、CSVの数を数えるということで、簡単に考えてみましたが、
Sub CSVFilesCounter()
Dim myFolder As Object
Dim FolderName As String
Dim FileName As String
Dim i As Long
'デフォルト・パス
Const DEF_FOLDER As String = "C:\"
'フォルダ選択
Set myFolder = CreateObject("Shell.Application"). _
BrowseForFolder(0, "フォルダを選択してください", 0, DEF_FOLDER)
If Not myFolder Is Nothing Then
FolderName = myFolder.Items.Item.Path
Else
Exit Sub
End If
FileName = Dir(FolderName & "\" & "*.csv")
Do While FileName <> ""
i = i + 1
FileName = Dir()
Loop
MsgBox FolderName & "\には、" & vbCrLf & i & " 個のCSVファイルがありました。", 64
End Sub
No.5
- 回答日時:
MsgBox i '二回目にこのコードを実行するとiが積算されます。
↓
j = MsgBox(i & vbCrLf & "初期化しますか?",vbYesNo)
If j = vbYes Then i = 0
No.4
- 回答日時:
Dim i As Integer'モジュールレベル変数
Sub Test()'テストプロシージャ
・・・・・・・
End Sub
この状態では、テストプロシージャを抜けても、モジュールレベル変数は開放されません。
開放されないと言うことは、設定された値が保持され続けると言うことです。
特に規約等の問題がない限りですが、カウンター値のような変数は、最小のスコープ(参照可能範囲)で宣言することが良いとされています。(個人的にはカウンター値以外にも、可能な限り最小スコープで宣言すべきと思っています)
具体例では、下記です。
↓削除でも構わないが、コメントアウトにしてみました
'Dim i As Integer
Sub Test()'テストプロシージャ
Dim i As Integer 'カウンタ変数
・・・・・・・
End Sub
こうすると、テストプロシージャに入った時点で初めて、変数iが作成されVBA(VB)では、0に初期化されます。(.NETでは明示的に初期化が必要)
テストプロシージャを抜けた瞬間に、変数iはメモリ上から開放され、そのとき保持していた値は発散します。
読み込んだファイル数を保存する必要があり、発散されては困る、ということであれば(というより、わざわざ数えているのですからそうなのでしょうが)以下のように書き換えられます。
↓ファイル数を保存するという意味で、勝手に変数名を作成しました
Dim FileCount As Integer'発見したファイル数を保持する変数
Sub Test()'テストプロシージャ
Dim i As Integer 'カウンタ変数
・・・・・・・
FileCount = i '発見したファイル数を退避させる
End Sub
プログラムがわかっている人から見れば、iが実は不要だ、とすぐにわかると思います。それでは試して見ましょう。
Dim FileCount As Integer'発見したファイル数を保持する変数
Sub Test()'テストプロシージャ
FileCount = 0 'ファイル数をこれから確認するため、
'その前0に初期化
・・・・・・・
Do ・・・
FileCount = FileCount + 1 'ファイルが見つかったため+1する
Loop
End Sub
最後のコードは元のコードと違う部分は、初期化しているかしていないか
他には変数名が変わっている、という違いです。
今回の初期化忘れというポカミスの原因は、小生の個人的意見ですが、変数名iが一番の原因であると思われるため、わざわざ回りくどく書きました。
ちなみに、ファイル数の確認だけであれば、小生はSubで書かずにFunctionで書いて、ファイル数を返り値として返す、というつくりにします。
No.3
- 回答日時:
(1)i の初期化がないですね
(2)If FiName = "False" Thenは「えっ」と思ったが、 FiName が文字列の場合は、正しいらしいですね。
http://www.officetanaka.net/excel/vba/file/file0 …
(3)If FiName = "False" Then
Exit Sub
If FiName = "False" Then
Exit Sub
はこれで完結してますね。EndIfが要らないという意味で。
そこで
Else
End If
End If
の位置付けはどうなっているのでしょうか。
誰もご指摘ないので、私の勘違いでしょうか。
If FiName = "False" Then Exit Sub
If Right(FiName, 3) <> "csv" Then
MsgBox "Chose a CSV file."
Exit Sub
Else
End If
のように、Else が要りませんか。
私の普通やる書き方と違うので。
現状が正しく動くのなら、すみません。
No.1ベストアンサー
- 回答日時:
ご質問のコードの中には、i=0という記述が見当たりません。
function()が無いので、カウンタiがsub()以外のどこで使用されているかわかりませんが、リセットしたいイベント(タイミング)でゼロを代入してはいかがでしょうか。お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
全ての変数を一気にリセットする方法はありますか?
PowerPoint(パワーポイント)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
Excelのマクロでボタンを押すと数が1足されるようにするには?
IT・エンジニアリング
-
-
4
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
5
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
6
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
-
7
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
8
エクセル マクロ名にブック名が付いた場合の修正方法
Excel(エクセル)
-
9
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
10
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
-
11
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
12
ACCESSでVBAから選択クエリの抽出条件を指定したい
Access(アクセス)
-
13
EXCEL-VBAでコマンドボタンに条件を追加したい
Visual Basic(VBA)
-
14
特定の名前のオートシェイプの有無を知りたい(エクセルVBA)
Excel(エクセル)
-
15
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
16
Excel VBA A列が特定の値以外の場合、その行を削除
Excel(エクセル)
-
17
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
18
エクセル:一般的に何メガくらいの容量なら安全ですか?
PowerPoint(パワーポイント)
-
19
VBマクロ 色の付いたセルを含む行をコピーしたい。
Visual Basic(VBA)
-
20
exeファイルの中身を見ることは可能ですか?
フリーソフト
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PC内で速度を遅くした音源をCD...
-
ファイル数と合計サイズの取得方法
-
複数のブックを新しいブックのS...
-
個別に違う添付ファイルを付け...
-
ビデオファイルのプロパティの...
-
スマホでtxtファイルを編集する...
-
SDカードを挿してるのに挿入し...
-
拡張子「.IDJ」を、windo...
-
ガラケーからPCへの写真の取り込み
-
透過処理をしたGIFファイル画像...
-
エクセルで「特定の文字を含む...
-
e-taxで送信ファイルの拡張子が...
-
画像をトリミングしてフォルダ...
-
エアコンの冷媒 R410Aの重...
-
カメラのフラッシュは大丈夫?
-
動画のURLの見方
-
Flashファイルからビルダー11...
-
このゲーム(フラッシュ)のダ...
-
リストビューで選択行の背景を...
-
情けない話ですが成田エクスプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
個別に違う添付ファイルを付け...
-
e-taxで送信ファイルの拡張子が...
-
エクセルで「特定の文字を含む...
-
スマホでtxtファイルを編集する...
-
複数のブックを新しいブックのS...
-
A4の紙に印刷されている文字を...
-
iPhoneの内蔵の記憶媒体は、HDD...
-
ビデオファイルのプロパティの...
-
エアコンの冷媒 R410Aの重...
-
ガラケーからPCへの写真の取り込み
-
拡張子「.IDJ」を、windo...
-
Fortniteのクラッシュについて
-
2枚、マイクロSDカードを入...
-
VBA:カウンターの i の値が開放...
-
stdio.hの中身
-
ファイル数と合計サイズの取得方法
-
TextBoxにフォーカスを与えると...
-
PC内で速度を遅くした音源をCD...
-
リストビューの選択状態を取得...
-
GIMP separate+プラグイン クラ...
おすすめ情報