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

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

新規登録して質問してみよう
ただいま回答率
85.42%
VBA

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

3回答

640閲覧

64ビットエクセルのVBAプログラム 止まる箇所についてご教授願う(32はOK

kazama001

総合スコア0

VBA

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2023/06/03 03:02

編集2023/06/07 23:15

実現したいこと

抜粋のVBAプログラムですが、
32ビットエクセルでしか動かせられず、ptrSafe を追加でして
さてそれ以外になにかあるか?と動作させたら、、手詰まり3日目となっております。

###前提
設計算出ソフト+CSVからエクセルへの変換シートを業務でつかっておりまして
CSVデータを、この変換エクセルシートにドロップすると自動で勝手に
シートが作成して、データが反映される形のものです。

この変換シートが32ビットエクセル対応で
できるならVBAをなおして64ビットでも使いたい。

発生している問題・エラーメッセージ

実行時エラー”9”
インデックスが有効範囲にありません。

と小窓がでて、デバックで見に行くと

下から5行目の
copysrcsheet.Copy before:=OutputWorkbook.Sheets("sheet2")
の部分が黄色となってる。

まだ下にソースコードがつづいてますが省略しました。

該当のソースコード

ソースコード

Output_Report.Cells(1, 1).Value = "シート名" Output_Report.Columns("A:A").Select Selection.ColumnWidth = 10 Output_Report.Cells(1, 2).Value = "ページ数" Output_Report.Columns("B:B").Select Selection.ColumnWidth = 10 Output_Report.Cells(1, 3).Value = "変換結果" Output_Report.Columns("C:C").Select Selection.ColumnWidth = 50 nKikiSueFuri$ = "" nZairyoSueFuri$ = "" nNinkuGoukeiRowKikiSuetsuke% = -1 nNinkuGoukeiRowKikiChosei% = -1 nNinkuGoukeiRowZairyoSuetsuke% = -1 nFigRowKikiSuetsuke% = -1 nFigRowKikiChosei% = -1 nFigRowZairyoSuetsuke% = -1 nNinkuSheet = 0 For i% = 1 To nCountCsv% 'CSVファイルを開く Workbooks.OpenText Filename:= _ Csv_senyou(i%).Path, StartRow:=1, _ DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _ :=False, Tab:=False, Semicolon:=False, Comma:=True, Space:=False, _ Other:=False, FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), _ Array(5, 2), Array(6, 2), Array(7, 2), Array(8, 2), Array(9, 2), Array(10, 2), Array(11, 2), _ Array(12, 2), Array(13, 2), Array(14, 2), Array(15, 2), Array(16, 2), Array(17, 2), _ Array(18, 2), Array(19, 2), Array(20, 2), Array(21, 2), Array(22, 2), Array(23, 2), Array(24, 2), _ Array(25, 2), Array(26, 2), Array(27, 2), Array(28, 2), Array(29, 2), Array(30, 2), _ Array(31, 2), Array(32, 2)) FigName$ = Csv_senyou(i%).FigName nFigLine% = Csv_senyou(i%).FigRow nTitleRow% = Csv_senyou(i%).TitleRow nTitleCol% = Csv_senyou(i%).TitleCol If FigName$ = "" Then GoTo EndFor End If If FigName$ = "人工集計" Then nNinkuSheet = 1 End If Set CsvSheet = ActiveSheet nPageCount% = 0 l% = nTitleRow% Do While CsvSheet.Cells(l%, Csv_senyou(i%).TitleCol).Value <> "" l% = l% + nFigLine% nPageCount% = nPageCount% + 1 Loop If nPageCount% = 0 Then GoTo EndFor End If FigName2$ = FigName$ If InStr(CsvSheet.Name, "合計一覧") > 0 Then If InStr(CsvSheet.Cells(3, 1), "種") > 0 Then FigName2$ = FigName2$ + "1" Else FigName2$ = FigName2$ + "2" End If End If Set copysrcsheet = ThisWorkbook.Sheets(FigName2$) 'コピー元シート copysrcsheet.Copy before:=OutputWorkbook.Sheets("sheet2") 'Sheet2がない場合は問題あり!**←←当初はここでエラーストップ** Set OutputSheet = OutputWorkbook.Sheets(FigName2$) 'コピー先シート OutputSheet.Name = Csv_senyou(i%).FigName + Csv_senyou(i%).SagyouName OutputSheet.Name = Mid(OutputSheet.Name, 2) OutputSheet.Activate

試したこと

Sheet2を1にしたり、番号なし。 上のカッコの中のFIGname2にもしてみました。

その他必要情報があるようでしたら公開しますので
ご教授願います。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/06/03 03:24

・64bit版のvbaを実行しているワークブックに「sheet2」という名前のシートがない ・64bit版のvbaを実行開始するときに「sheet2」という名前のシートをもっているワークブックがアクティブになっていない のどっちかなんじゃないですか?
kazama001

2023/06/03 03:45

会社にある、32ビット版エクセルでは、このVBAがすんなり進みます。 このコード上位に入ってる(文字制限の為、カットしました)、指定した名前の シート名称でバタバタと並ぶ正常動作をしてます。なので64ビットに対応する どこかを直せば行ける。とふんでるのですが、、どうも進まないのです
kaz.Suenaga

2023/06/03 08:16

OutputWorkbook はどこで定義されているのでしょうか。このエラーが出る実行箇所より前で確かに定義されているのでしょうか。
kazama001

2023/06/05 23:01

お返事が遅くなり申し訳ありません。 エラーでる箇所より上位側を全部残してたと思ったのですが いま確認したら削っておりました。のちほど追記したいと思います。
kazama001

2023/06/05 23:07

以下が削っていた上位の部分です。いくつかoutputworkbook があります。 これだけでは足りないでしょうか ーーーーーーーーーーーーーーーーー Type Csvtype Name As String Path As String FigName As String SagyouRank As Integer Rank As Integer FigRow As Integer FigCol As String TitleRow As Integer TitleCol As Integer DataMinRow As Integer DataMinCol As Integer DataMaxRow As Integer DataMaxCol As Integer JoukenRow As Integer UchiwakeStartRow As Integer UchiwakeRowSpan As Integer UchiwakeStartCol As Integer UchiwakeColSpan As Integer SagyouName As String GoukeiRow As Integer End Type Sub CHIKEN_HENKAN(SetubiNo, CsvTmpFileName) '画面更新off Application.ScreenUpdating = False ProFileName = ActiveWorkbook.Name SystembookPath$ = ThisWorkbook.Path SheetNameHyou_Info$ = "表情報" Set Hyou_Info = ThisWorkbook.Sheets(SheetNameHyou_Info$) SheetNameHiroi$ = "B拾出" Set Hiroi = ThisWorkbook.Sheets(SheetNameHiroi$) SheetNameShukei$ = "A集計" Set Shukei = ThisWorkbook.Sheets(SheetNameShukei$) SheetNameIkkatsu_Shukei$ = "8一括集計" Set Ikkatsu_Shukei = ThisWorkbook.Sheets(SheetNameIkkatsu_Shukei$) SheetNameSokatsu$ = "9総括" Set Sokatsu = ThisWorkbook.Sheets(SheetNameSokatsu$) SheetNameIkkatsu_Sokatsu$ = "7一括総括" Set Ikkatsu_Sokatsu = ThisWorkbook.Sheets(SheetNameIkkatsu_Sokatsu$) SheetNameZairyo_Suetsuke$ = "6材料据付" Set Zairyo_Suetsuke = ThisWorkbook.Sheets(SheetNameZairyo_Suetsuke$) SheetNameNinku_Shukei$ = "3人工集計" Set Ninku_Shukei = ThisWorkbook.Sheets(SheetNameNinku_Shukei$) SheetNameKiki_Suetsuke$ = "4機器据付" Set Kiki_Suetsuke = ThisWorkbook.Sheets(SheetNameKiki_Suetsuke$) SheetNameKiki_Chosei$ = "5機器調整" Set Kiki_Chosei = ThisWorkbook.Sheets(SheetNameKiki_Chosei$) SheetNameSeisaku$ = "1機器製作" Set Seisaku = ThisWorkbook.Sheets(SheetNameSeisaku$) SheetNameSecchi$ = "2設備設置" Set Secchi = ThisWorkbook.Sheets(SheetNameSecchi$) ' SheetNameKousu_Keisan$ = "据付工数計算" ' Set Kousu_Keisan = ThisWorkbook.Sheets(SheetNameKousu_Keisan$) SheetNameZairyo_Tanka$ = "C材料単価表" Set Zairyo_Tanka = ThisWorkbook.Sheets(SheetNameZairyo_Tanka$) SheetNameZairyo_FukugoTanka$ = "D材料複合単価表" Set Zairyo_FukugoTanka = ThisWorkbook.Sheets(SheetNameZairyo_FukugoTanka$) SheetNameHaisen$ = "E配線表" SheetNameGoukei$ = "F合計一覧" 'データブックの作成 Workbooks.Add 'ブックの新規作成 Set OutputWorkbook = ActiveWorkbook Set Output_Report = OutputWorkbook.Sheets("Sheet1") Output_Report.Select Output_Report.Name = "変換報告" 'CSVファイルの拡張子の判断 Workbooks.Open CsvTmpFileName CsvMotoFilePath = ActiveWorkbook.Path CsvTmpFile = ActiveWorkbook.Name If Right$(CsvTmpFile, 3) = "csv" Then CsvTxtMode = "csv" ElseIf Right$(CsvTmpFile, 3) = "txt" Then CsvTxtMode = "txt" Else Exit Sub End If Workbooks(CsvTmpFile).Close SaveChanges:=False 'CSV名のリストアップ Dim Csv_senyou(32) As Csvtype '各表のページ行数を得る i% = 0 Filename$ = Dir(CsvMotoFilePath & "\*." & CsvTxtMode, vbNormal) Do While Filename$ <> "" i% = i% + 1 ' Output_Report.Cells(i%, 1).Value = Filename$ Csv_senyou(i%).Path = CsvMotoFilePath & "\" & Filename$ Csv_senyou(i%).Name = Filename$ SagyouName$ = GetSagyouNameString(Filename$) l% = 2 Do While Hyou_Info.Cells(l%, 1).Value <> "" strCsvFile$ = Hyou_Info.Cells(l%, 1).Value ' & "." & CsvTxtMode ' If Csv_senyou(i%).Name = strCsvFile$ Then strCsvFile$ = Mid(strCsvFile$, 2) If InStr(Csv_senyou(i%).Name, strCsvFile$) = 1 Then '> 0 Then Csv_senyou(i%).FigName = Hyou_Info.Cells(l%, 1).Value ' + SagyouName$ Csv_senyou(i%).SagyouRank = GetSagyouNameRank(Filename$) Csv_senyou(i%).Rank = Hyou_Info.Cells(l%, 2).Value Csv_senyou(i%).FigRow = Hyou_Info.Cells(l%, 3).Value Csv_senyou(i%).FigCol = Hyou_Info.Cells(l%, 4).Value Csv_senyou(i%).TitleRow = Hyou_Info.Cells(l%, 5).Value Csv_senyou(i%).TitleCol = Hyou_Info.Cells(l%, 6).Value Csv_senyou(i%).DataMinRow = Hyou_Info.Cells(l%, 7).Value Csv_senyou(i%).DataMinCol = Hyou_Info.Cells(l%, 8).Value Csv_senyou(i%).DataMaxRow = Hyou_Info.Cells(l%, 9).Value Csv_senyou(i%).DataMaxCol = Hyou_Info.Cells(l%, 10).Value Csv_senyou(i%).JoukenRow = Hyou_Info.Cells(l%, 11).Value Csv_senyou(i%).UchiwakeStartRow = Hyou_Info.Cells(l%, 12).Value Csv_senyou(i%).UchiwakeRowSpan = Hyou_Info.Cells(l%, 13).Value Csv_senyou(i%).UchiwakeStartCol = Hyou_Info.Cells(l%, 14).Value Csv_senyou(i%).UchiwakeColSpan = Hyou_Info.Cells(l%, 15).Value Csv_senyou(i%).SagyouName = SagyouName$ Csv_senyou(i%).GoukeiRow = Hyou_Info.Cells(l%, 16).Value Exit Do End If l% = l% + 1 Loop Filename$ = Dir() Loop nCountCsv% = i% 'ランク順に並び替え For i% = 1 To (nCountCsv% - 1) For j% = (i% + 1) To nCountCsv% nSagyouRank1% = Csv_senyou(i%).SagyouRank nSagyouRank2% = Csv_senyou(j%).SagyouRank nRank1% = Csv_senyou(i%).Rank nRank2% = Csv_senyou(j%).Rank If nSagyouRank1% > nSagyouRank2% Or (nSagyouRank1% = nSagyouRank2% And nRank1% > nRank2%) Then B00$ = Csv_senyou(i%).Name B0$ = Csv_senyou(i%).Path B1$ = Csv_senyou(i%).FigName B2d% = Csv_senyou(i%).SagyouRank B2% = Csv_senyou(i%).Rank B3% = Csv_senyou(i%).FigRow B3d$ = Csv_senyou(i%).FigCol B4% = Csv_senyou(i%).TitleRow B5% = Csv_senyou(i%).TitleCol B6% = Csv_senyou(i%).DataMinRow B7% = Csv_senyou(i%).DataMinCol B8% = Csv_senyou(i%).DataMaxRow B9% = Csv_senyou(i%).DataMaxCol B10% = Csv_senyou(i%).JoukenRow B11% = Csv_senyou(i%).UchiwakeStartRow B12% = Csv_senyou(i%).UchiwakeRowSpan B13% = Csv_senyou(i%).UchiwakeStartCol B14% = Csv_senyou(i%).UchiwakeColSpan B15$ = Csv_senyou(i%).SagyouName B16% = Csv_senyou(i%).GoukeiRow Csv_senyou(i%).Name = Csv_senyou(j%).Name Csv_senyou(i%).Path = Csv_senyou(j%).Path Csv_senyou(i%).FigName = Csv_senyou(j%).FigName Csv_senyou(i%).SagyouRank = Csv_senyou(j%).SagyouRank Csv_senyou(i%).Rank = Csv_senyou(j%).Rank Csv_senyou(i%).FigRow = Csv_senyou(j%).FigRow Csv_senyou(i%).FigCol = Csv_senyou(j%).FigCol Csv_senyou(i%).TitleRow = Csv_senyou(j%).TitleRow Csv_senyou(i%).TitleCol = Csv_senyou(j%).TitleCol Csv_senyou(i%).DataMinRow = Csv_senyou(j%).DataMinRow Csv_senyou(i%).DataMinCol = Csv_senyou(j%).DataMinCol Csv_senyou(i%).DataMaxRow = Csv_senyou(j%).DataMaxRow Csv_senyou(i%).DataMaxCol = Csv_senyou(j%).DataMaxCol Csv_senyou(i%).JoukenRow = Csv_senyou(j%).JoukenRow Csv_senyou(i%).UchiwakeStartRow = Csv_senyou(j%).UchiwakeStartRow Csv_senyou(i%).UchiwakeRowSpan = Csv_senyou(j%).UchiwakeRowSpan Csv_senyou(i%).UchiwakeStartCol = Csv_senyou(j%).UchiwakeStartCol Csv_senyou(i%).UchiwakeColSpan = Csv_senyou(j%).UchiwakeColSpan Csv_senyou(i%).SagyouName = Csv_senyou(j%).SagyouName Csv_senyou(i%).GoukeiRow = Csv_senyou(j%).GoukeiRow Csv_senyou(j%).Name = B00$ Csv_senyou(j%).Path = B0$ Csv_senyou(j%).FigName = B1$ Csv_senyou(j%).SagyouRank = B2d% Csv_senyou(j%).Rank = B2% Csv_senyou(j%).FigRow = B3% Csv_senyou(j%).FigCol = B3d$ Csv_senyou(j%).TitleRow = B4% Csv_senyou(j%).TitleCol = B5% Csv_senyou(j%).DataMinRow = B6% Csv_senyou(j%).DataMinCol = B7% Csv_senyou(j%).DataMaxRow = B8% Csv_senyou(j%).DataMaxCol = B9% Csv_senyou(j%).JoukenRow = B10% Csv_senyou(j%).UchiwakeStartRow = B11% Csv_senyou(j%).UchiwakeRowSpan = B12% Csv_senyou(j%).UchiwakeStartCol = B13% Csv_senyou(j%).UchiwakeColSpan = B14% Csv_senyou(j%).SagyouName = B15$ Csv_senyou(j%).GoukeiRow = B16% End If Next Next
kaz.Suenaga

2023/06/06 00:29

質問文は修正できるので、質問文に追記していただけますか。 その方が他の方にとっても情報になります。 (と、書式がきいて読みやすくなります)
guest

回答3

0

追加されたコード内で、作成するブックを新規に作成しているようですが、
このブックで用意されるシートの数が32bit版と64bit版で違っていたりしないでしょうか。

vba

1'データブックの作成 2 Workbooks.Add 'ブックの新規作成 3 Set OutputWorkbook = ActiveWorkbook

古めのエクセルだと、新規ブックにはシートが3つ用意されていましたが、最近のものは、1つになっています。
このため、作成した新規ブックのsheet2が存在せず、エラーになっているのではないでしょうか。

おそらく、エラーになっている

vba

1copysrcsheet.Copy before:=OutputWorkbook.Sheets("sheet2")

vba

1copysrcsheet.Copy

とすれば(シートの追加位置を指定しない)良いように見えます。
もしくは、

vba

1copysrcsheet.Copy after:=Output_Report

として、sheet1 → 変換報告 としてシートの後に作成するようにする。

投稿2023/06/06 00:30

kakzumi

総合スコア43

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

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

kazama001

2023/06/06 04:19

copysrcsheet.Copy after:=Output_Report に変更しましたら、進みました。  ですが、それ以降でまた、 実行時エラー”9” インデックスが有効範囲にありません。 とでてしましい、次の問題になりました。でもVBAが進んだことがうれしくてあありがとうございます。 また自力で対応してみて、、厳しいようでしたら、ここにご相談したいと思います。 シートの数で、、あっ!!と思いました。 本当にありがとうございました。
kakzumi

2023/06/06 04:48

少し進んだようで良かったです。 修正箇所を最小限にして、同じシート数のファイルを作成するのなら   Set OutputWorkbook = ActiveWorkbook の後に  ActiveWorkbook.sheets.add after:=ActiveWorkbook.Sheets(1)  ActiveWorkbook.sheets(2).Name = "sheet2"  ActiveWorkbook.sheets.add after:=ActiveWorkbook..Sheets(2)  ActiveWorkbook.sheets(3).Name = "sheet3" といれて、以前と同様に sheet2 と sheet3 を作成する。 なんて方法もありました。
guest

0

やっぱり、、自己解決には届かなくて困ってます。
業務用ソフトで、吐き出されるCSVデータを
いくつかの標準モジュールを載せた、エクセル変換シートがあってそこに
操作するとそのエクセルシートに変換されてでてくるものです。

このエラーになる、まとまったエクセルシートと、CSVデータとを
セットで送りますので、どなたか修正して完成していただくことは可能でしょうか

投稿2023/06/08 11:25

kazama001

総合スコア0

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

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

0

ちゃんと見れてなくもうしわけございません。
FigName2$に実際に格納される値はどうなってますでしょうか?

投稿2023/06/06 06:31

ramosu11

総合スコア14

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

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

kazama001

2023/06/06 07:22

質問ありがとうございます。 会社員で、メインの仕事はしっかりやってね。この エクセルVBAプログラムは片手間程度にやって、修正が 完成したら、社内でだいぶ楽になるので急がずまあできる 範囲でやってみて、、的なので、お礼返信や、追加情報の展開が おそくなり、すいません。 のちほど、お伝えします
ramosu11

2023/06/06 09:28 編集

承知しました。 もし格納されている値が数値の場合だとシートナンバーから検索かけてしまっているかもしれないと思いました。 ご存じかもしれませんがシートは二つの名前?を持ってます。  例 表示されているシート名を"あああ"にした場合でも裏ではSheets(1)のような管理がされている FigName2$に格納されている値が数値になってしまうと裏で管理されているSheetのナンバーで検索かけてしまって指定したいシートと異なっている場合があります。  例 表示名が"1"でも裏ではSheets(3)で管理されている & FigName2$が"1"の場合    Sheets(FigName2$)でSheets(3)を指定したくてもSheets(1)を指定になる
kazama001

2023/06/07 23:21

返答がおそくなり、すいません。 FigName2$  に格納しているデータは以下の状態です。 FigName2$ = FigName$ 最初の質問の中の該当ソースコードで下から5行目あたりでストップしてた部分の対応で kakzumi様の修正指摘で、ここのエラー対応が解消したのですがそれ以降で別の問題個所で ストップしているところです。 なんとか自力で頑張ろうとしている次第です。 以上が現段階です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問