質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

1109閲覧

VBA Macのエクセルで作成したマクロをWindowsで正常に実行できない。

icecleam

総合スコア46

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/09/23 11:45

以下のマクロをMacのエクセルで作成し正常に実行できるのを確認したのですが、windowsで実行しようとすると、転記先に何も転記されず、何も実行されませんでした。

こうなる前は、
「プロジェクトまたはライブラリが見つかりません」
というコンパイルエラーが出ており、その際は参照設定を少しいじって解決したのですが、それ以降この問題で詰まってしまいました。

windowsとMacではそもそもマクロの設定が異なるみたいな話も聞いたのですが、以下のソースをどのように修正したら、windowsでも動くようになるでしょうか。

どうか、ご助力をいただけたらと思います。。

転記先と転記元は以下のようになっています。

補足ですが
デバッグをしたところ①から②へ処理が飛んでいました(今windowsが手元にないので微妙に場所が違ったかもです、すみません)

転記元
イメージ説明

転記先
イメージ説明

Macro

1Sub sample1() 2 3 Dim lngRowsNo As Long ' 書きこむ位置 4 Dim lngSheetIndex As Long ' シートの番号 5 Dim strFile As String ' Excelファイルの場所 6 Dim xlsAcq As New Excel.Application ' 取得側Excel 7 Dim wbAcq As Workbook ' 取得側Excelブック 8 Dim wsAcq As Worksheet ' 取得側Excelシート 9 Dim wsSet As Worksheet ' 設定側Excelシート 10 Const strPath As String = "パスを指定" 11 Set wsSet = ActiveSheet 12 Dim i As Long 13 14 strFile = Dir(strPath & "*.xls") 15 lngRowsNo = 3 16 Do Until strFile = "" 17'① 18 '----- Excelブックを開く 19 Set wbAcq = Workbooks.Open(strPath & strFile) 20 21 '----- シートを検索 22 For lngSheetIndex = 1 To wbAcq.Worksheets.Count 23 '----- 「更新」シートを検索 24 If wbAcq.Worksheets(lngSheetIndex).Name = "更新" Then 25 '----- 「更新」シートを変数へ登録 26 Set wsAcq = wbAcq.Worksheets(lngSheetIndex) 27 '----- 「更新」シートの内容を現在のシートにコピー(自由に変更して下さい) 28 With wsAcq 29 Dim fname As String 'ファイル名 30 Dim n As Long 'ループで使用します。 31 Dim m As Long 'ループで使用します。 32 Dim ec1 As Long '各開発の一番下の担当者のセルを取得 33 Dim ec2 As Long '各開発の 月の一番右(最後)のセルを取得 34 Dim ColumnNo As Long ' 転記先の列番号(初期値4) 35 Dim ColumnNo2 As Long ' 転記元の列番号(初期値5)+3されていく 36 37 ColumnNo = 4 38 ColumnNo2 = 5 39 40 For i = 1 To .UsedRange.Rows.Count 41 42 If (Left(.Cells(i, 2).Value, 3) = "開発A" Or Left(.Cells(i, 2).Value, 3) = "開発B" Or Left(.Cells(i, 2).Value, 3) = "開発C") And .Cells(i, 2).MergeCells = False Then 43 '月を取得して転記 44 ec2 = .Cells(i + 1, 5).End(xlToRight).Column + 1 45 For col = 5 To ec2 46 47 wsSet.Cells(2, ColumnNo).Value = .Cells(i + 1, ColumnNo2).Value 48 49 ColumnNo = ColumnNo + 1 50 ColumnNo2 = ColumnNo2 + 3 51 52 Next col 53 54 ' ------ 開発〇から一番上の担当者のセル位置を相対的にCells(i + 3, 3)として取得し 55 'データの入っているところまでループさせる (その時、開発名を転記) 56 ec1 = .Cells(i + 3, 2).End(xlDown).Row 57 For n = i + 3 To ec1 58 59 '担当者が空白の時スキップする 60 If Cells(n, 3) = "" Then 61 GoTo NEXT99 62 End If 63 64 'ファイル名 65 fname = ActiveWorkbook.Name 66 wsSet.Cells(lngRowsNo, 1).Value = fname 67 68 '開発 69 wsSet.Cells(lngRowsNo, 2).Value = .Cells(i, 2).Value 70 71 '担当者 72 wsSet.Cells(lngRowsNo, 3).Value = .Cells(n, 3).Value 73 74 '工数 75 wsSet.Cells(lngRowsNo, 4).Value = .Cells(n, 5).Value 76 77 wsSet.Cells(lngRowsNo, 5).Value = .Cells(n, 8).Value 78 79 wsSet.Cells(lngRowsNo, 6).Value = .Cells(n, 11).Value 80 81 wsSet.Cells(lngRowsNo, 7).Value = .Cells(n, 14).Value 82 83 wsSet.Cells(lngRowsNo, 8).Value = .Cells(n, 17).Value 84 85 wsSet.Cells(lngRowsNo, 9).Value = .Cells(n, 20).Value 86 87 wsSet.Cells(lngRowsNo, 10).Value = .Cells(n, 23).Value 88 89 wsSet.Cells(lngRowsNo, 11).Value = .Cells(n, 26).Value 90 91 wsSet.Cells(lngRowsNo, 12).Value = .Cells(n, 29).Value 92 93 wsSet.Cells(lngRowsNo, 13).Value = .Cells(n, 32).Value 94 95 '1行下へ 96 lngRowsNo = lngRowsNo + 1 97 98 99 100NEXT99: 101 Next n 102 End If 103 Next i 104 End With 105 '② 106 '----- 検索の終了 107 Exit For 108 End If 109 Next lngSheetIndex 110 111 '----- シート参照の解放 112 Set wsAcq = Nothing 113 '----- ブックを閉じる 114 wbAcq.Close Savechanges:=False 115 '----- 次のファイルへ 116 strFile = Dir() 117 Loop 118 119 '----- Excelへの参照の解放 120 Set xlsAcq = Nothing 121 122End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hana_yama_san

2020/09/23 12:21

winとmacでVBAの仕様が違うのは、 「まあ、多分そうなんでしょうね」 という感慨しかありません。 で、正直に言って 「他人の書いた、しかもこんなクソ長いコードを読めるかよ」 と、身も蓋もない答えしか出ません。  ※しかも、あまり構造化しているとは言い難い。 自分でコードを整理して、 ある程度構造化したら、 質問に回答してくる人も出てくるかも知れません。
iruyas

2020/09/23 14:05

"パスを指定" ↑の指定を間違えているに1票
icecleam

2020/09/23 14:08

パスはwinとMacの時で変わるので特に注意して何度も確認しましたが、それでもダメでした。。
iruyas

2020/09/23 14:15

末尾に¥記号はついてますか?
icecleam

2020/09/23 14:18

/xxxx/yyyy という形で記載していました。。 末尾に¥がいるのですね、すみません、明日それで試して見ます!
guest

回答1

0

ベストアンサー

パス指定で区切り忘れを防止したいのであればこんな方法もあります。

VBA

1strFile = Dir(strPath & Application.PathSeparator & "*.xls") 2

Application.PathSeparatorはWindowsなら「\」を、Macなら「:」を返します。

投稿2020/09/24 02:01

radames1000

総合スコア1923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問