4つのPCでマクロを動かし、1つのPCで出力結果が異なってしまいました。
少しずつコードを動かしたところ以下★★★で差異が見られました。
ですが、マクロ初心者なもので何故出力結果が違うのか見当がつきません。詳しい方教えてください!!
<出力結果の違い>
3つのPCでは複数ファイルを読み込ませて複数行結果が出力される、F列にデータ有(理想の結果)
1つのPCでは複数ファイルを読み込ませても1行しか結果が出てこない
F列のデータが空白
PCのバージョンなどは4つ全て同じで確認済みです。
↓文字数の関係で色々過程を省略しました(ここに問題があるのでは?と思う部分を残しています)
Sub データ修正()
'カレントディレクトリを以下に変更
ChDir ("C:\Users\Aiba\Desktop\work\マクロ\log")
'フォルダのパスを表示
'MsgBox CurDir("C:")
Dim fName As Variant
'k はファイルの個数を表す
Dim k, IRow, ICol, hina_Row, hina_Col As Long
Dim wb, wb_test As Workbook
Application.ScreenUpdating = Flase
'アクティブブックと同じ場所に保存されている”データ修正ひな型.xlsx”を開く
'Workbooks.Open Filename:=ThisWorkbook.Path & "\データ修正ひな型"
Set wb_test = Workbooks.Open(ThisWorkbook.Path & "\データ修正ひな型")
'ファイルを複数選択して開く
fName = Application.GetOpenFilename(FileFilter:="Excelブック,*.xlsx*", MultiSelect:=True)
If IsArray(fName) Then
'選択されたファイルへの処理
For k = LBound(fName) To UBound(fName)
Set wb = Workbooks.Open(fName(k))
'-------- ここ以降に、wbに対する処理を書く --------
'B列が空白の場合行ごと削除する
Dim intRowEnd As Integer '最終行番号を格納
Dim i As Integer '行カウンタ
'最終行番号の取得
intRowEnd = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row ←★★★
For i = intRowEnd To 1 Step -1
'B列が空白の場合、行削除
If wb.Sheets(1).Cells(i, 2).Value = "" Then
wb.Sheets(1).Rows(i).Delete
End If
Next
Dim MaxGyou As Long '全体の行数をカウント A1から数える
MaxGyou = wb.Sheets(1).Range("A1").End(xlDown).Row
If MaxGyou = 1048576 Then '元のデータが1行のときは1048576が返る
MaxGyou = 1
End If
Dim Flag_GaitouNashi As Integer '該当件数0フラグ
Flag_GaitouNashi = 0
'---1枚のシートを追加し、名前を変更
wb.Worksheets.Add(After:=wb.Worksheets(1), Count:=1).Name = "修正後"
For i = 1 To MaxGyou
If wb.Sheets(1).Cells(i, 1).Value = wb.Sheets(1).Cells(i, 2).Value Then
Flag_GaitouNashi = 1
wb.Sheets(2).Range("A" & i).Value = "-"
GoTo Label1
End If
Dim tmp As Variant
tmp = Split(wb.Sheets(1).Range("A" & i), "\") ' \で区切られた文字列をtmpに格納
wb.Sheets(2).Range("J" & i).Value = tmp(UBound(tmp))
Label1:
Next i
If Flag_GaitouNashi = 1 Then
wb.Sheets(2).Range("C1").Value = "該当なし"
End If
'ファイルを保存せずに閉じる
Application.DisplayAlerts = False
wb.Close Flase
'次のファイルへ
Next k
wb_test.Sheets(1).Activate
wb_test.Sheets(1).Range("A1").Select
Else
'ファイル選択画面でキャンセルした場合
MsgBox "キャンセルされました"
End If
With wb_test.Sheets(1)
'データシートの行数を調べる
IRow = .Cells(Rows.Count, 1).End(xlUp).Row
.Range("A:L").AutoFilter
.Sort.SortFields.Clear
'優先列1 対象データ列 降順
.Sort.SortFields.Add _
Key:=wb_test.Sheets(1).Cells(1, 1), _
SortOn:=xlSortOnValues, _
Order:=xlDescending, _
DataOption:=xlSortNormal
With .Sort
.SetRange wb_test.Sheets(1).Range(wb_test.Sheets(1).Cells(1, 1), wb_test.Sheets(1).Cells(IRow, 12))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
ファイル保存作業省略
Application.ScreenUpdating = True
End Sub
No.2ベストアンサー
- 回答日時:
全く同じファイルで動作確認しているのであれば、
★★★の部分って、結果が異なるとは思えないんですよね。
ただ最終行を取得するだけですから。
intRowEnd = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
★★★の行の後に
MsgBox wb.Sheets(1).Name & "-" & intRowEnd
と入れれば、
どのシートを見ていて、その最終行がいくつか
を処理の途中で表示することができます。
それが同じなら、その部分に問題がないことがわかります。
自力解決するなら、
Application.ScreenUpdating = Flase
の先頭に「’」をつけてコメントアウトして処理中の画面の変化をみられるようにし、
マクロにブレークポイントを設定したり、
「F8」キーで1処理ずつステップ実行して変化を追っていったり、
途中で怪しいと思われる変数に対して上で書いたようにMsgbox で表示させて確認したり、
なんて方法を交えて原因を探ることもできると思います。
参考記事
↓
最も基本的なステップ実行 - Excel VBA
https://www.239-programing.com/excel-vba/basic/b …
マクロにブレークポイントを設定して、「F8」キーで処理を追っていきましたが、変数は同じでした。やはりPCに問題がありそうです。ありがとうございました。
No.4
- 回答日時:
No3です
>つまり行数がたくさん出てくるはずなのです。
結果から原因を推測するのは必ずしも間違いではないとは思いますが、真の原因を突き止めないと修正しようがありません。
No3にも書きましたが、
>←★★★
の処理で、具体的に求めた行数がどのように異なるのでしょうか?
もしも本当に異なるのなら、その違いがどこから生じているのかを突き止めないと、本当の原因にはたどり着けないと思います。
ご質問とは関係ありませんけれど、ざっと見ただけではありますが、ご提示の処理にも疑問点がいろいろ散見されます。
例えば、行数を扱うのにInteger宣言をしていますが、エクセルの最大行数はIntegerの範囲を超えています。
(まぁ、扱う行数が少なければ問題はないかもですけれど・・・)
あるいは、シート内に一行でも「A列の値=B列の値」となる行が存在すると「該当なし」と判断されるようになっているとか…
(実際に何をなさりたいのかわからないので、これでいいのかも知れませんけれど、普通はこのような扱いはしない場合が多いので)
などなど・・・
No.3
- 回答日時:
こんにちは
ざっとしか見ていませんけれど・・・
>以下★★★で差異が見られました。
違っているなら、その時の値から推測ができそうに思いますけれど、どう違っているのでしょうか?
複数のファイルを順に処理していますが、全部のブックで値が異なるのでしょうか、それとも特定のブックだけ異なる?
しかしながら、仮にご指摘の部分で値が異なっていても、ご提示の処理では、ループ内の処理はOpenしたブックに限定されていて、Closeの際には変更をキャンセルしているので、結果が変わることは無いと思われます。
それとも、どこかの値を保持して別のブックへ転記しているのでしょうか?
(その部分が見当たらない)
仮に、ご提示の処理をそのまま、4つのPCで実行した場合に本当に差異がでるのでしょうか?
なんだか、原因は全然別のところにあるのではという気がしますけれど。
すみません。文字数の関係から過程を省略しすぎました。複数のファイルを読み込んでデータ処理して1つのファイル・シートに保存するマクロなのですが・・・つまり行数がたくさん出てくるはずなのです。
問題有のPCで実行すると、複数ファイルを読み込ませても、ファイル保存されたファイルを開くと1行しか表示されません。3つファイルを読み込ませたら最低でも3行以上は出てこないとだめなのですが。
私自身も問題は別のところにあるような気がします。質問しておいてすみません。
No.1
- 回答日時:
全部読む気がしないので
一般的な回答のみ
PCのバージョンとありますが なんのバージョンですかね?
PCごとに環境が違うので 下記を確認する必要があります
1.エクセルのバージョン
2.OS(OSに依存する処理がある場合)
3.デスクトップのパス
デスクトップのパスはPCごとに違います
絶対パスで指定する場合には注意
相対パスにするか、パスを取得してから絶対パスを指定する
ブレークポイントを設定し 1行ごとに変数の値等、
現在の状態を確認すると良いでしょう
回答ありがとうございます。PCのバージョンはOffice365バージョンです。
パスは全て同じに設定してあります。
4つすべて所有者が違うので1つ1つ変数を確認することは難しいのですが時間のあるときに試してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでPowerPointからExcelにデ...
-
VB6側からテキストファイルをク...
-
テキストファイルを直接置換す...
-
特定フォルダ内のテキストファ...
-
バッチでiniファイルの編集
-
ある文字列を含む行の抽出
-
VBSを用いてIPアドレスを取得し...
-
テキストファイルの行頭に文字...
-
ランレングス符号化を用いた符...
-
fortranでのcsvファイルを出力...
-
複数行の文字列を変数として使...
-
Excel.VBA テキストファイルを...
-
VBAで任意のフォルダ内のファイ...
-
cobolのコメント削除
-
A列をテキストファイル名に、B...
-
unicode文字列(日本語)のファイ...
-
C#でのファイル編集と上書き保...
-
VBAで新しい日付順にファイルを...
-
コマンドプロンプトの「%1」と...
-
バッチでテキストファイルから...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6側からテキストファイルをク...
-
VBAで新しい日付順にファイルを...
-
VBAでPowerPointからExcelにデ...
-
特定フォルダ内のテキストファ...
-
BCPユーティリティの使用法_...
-
ある文字列を含む行の抽出
-
access vbaでCSVファイルを文...
-
テキストファイルを直接置換す...
-
複数行の文字列を変数として使...
-
テキストファイルの行頭に文字...
-
A列をテキストファイル名に、B...
-
バッチでiniファイルの編集
-
Excel.VBA テキストファイルを...
-
fortranでのcsvファイルを出力...
-
unicode文字列(日本語)のファイ...
-
RandomとBinaryモードの違い
-
ソースコードの差分がある行番...
-
c言語の問題です
-
C#でのファイル編集と上書き保...
-
VBAで任意のフォルダ内のファイ...
おすすめ情報