
実現したいこと
抜粋の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にもしてみました。
その他必要情報があるようでしたら公開しますので
ご教授願います。

・64bit版のvbaを実行しているワークブックに「sheet2」という名前のシートがない
・64bit版のvbaを実行開始するときに「sheet2」という名前のシートをもっているワークブックがアクティブになっていない
のどっちかなんじゃないですか?
会社にある、32ビット版エクセルでは、このVBAがすんなり進みます。
このコード上位に入ってる(文字制限の為、カットしました)、指定した名前の
シート名称でバタバタと並ぶ正常動作をしてます。なので64ビットに対応する
どこかを直せば行ける。とふんでるのですが、、どうも進まないのです
OutputWorkbook はどこで定義されているのでしょうか。このエラーが出る実行箇所より前で確かに定義されているのでしょうか。
お返事が遅くなり申し訳ありません。
エラーでる箇所より上位側を全部残してたと思ったのですが
いま確認したら削っておりました。のちほど追記したいと思います。
以下が削っていた上位の部分です。いくつか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
質問文は修正できるので、質問文に追記していただけますか。
その方が他の方にとっても情報になります。
(と、書式がきいて読みやすくなります)
