私の状況:ファイル拡張子としてxslmを持つ新しいワークブックを作成し、1枚のシートの名前を編集してデータを入れることになっているExcelワークブックがあります。保存して閉じた後、xslmとしてVBAマクロが失われる
ComboBoxが作成され、ComboBoxがデータで埋められ、新しいブックでComboBox1_Change Subを持つマクロが作成されます。
これがすべて完了すると、新しいブックが保存され、閉じられます。
問題は、ブックを再度開くと、コンボボックスが空であり、マクロがブックにもう存在しないということです。 いくつかの調査の後、私はxslmではなくxlsxとしてシートを保存する人々にこの問題を発見しましたが、私のコードではそうではないことを確認しました。
多分私は何かを見落としているかもしれませんが、私はすべてのことがうまくいっているかどうかを確認するためにcloseコマンドにブレークポイントを設定しました。だから、問題は近くになければならず、保存しなければならない。 私はそれを保存して別々に閉じたり、新しいワークブックをアクティブにして保存したりしようとしました。 誰かが私を助けてくれるかもしれません。
編集:私は
事前に感謝をエクセル2007を使用していたコードは以下の通りです:
Sub createTemplate()
Dim currentWB As Workbook
Set currentWB = ThisWorkbook
Dim template As Workbook
Dim curResSht As Worksheet
Dim temUtiSht As Worksheet
Dim curHolSht As Worksheet
Dim temHolSht As Worksheet
Workbooks.Add
Set curResSht = currentWB.Worksheets("Resource Plan")
Set curHolSht = currentWB.Worksheets("Holidays")
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=currentWB.Path & "\Template.xlsm", FileFormat:=52
Set template = ActiveWorkbook
template.Sheets(3).name = "Holidays"
template.Sheets(2).name = "Person List"
template.Sheets(2).Visible = False
template.Sheets(1).name = "Utilisation"
Set temUtiSht = template.Worksheets("Utilisation")
Set temHolSht = template.Worksheets("Holidays")
For i = 1 To 4
curResSht.Rows(i).EntireRow.Copy
temUtiSht.Rows(i).EntireRow.PasteSpecial
Next i
For i = 1 To 3
curHolSht.Rows(i).EntireRow.Copy
temHolSht.Rows(i).EntireRow.PasteSpecial
Next i
Application.DisplayAlerts = True
Dim curDatSht As Worksheet
Dim temLisSht As Worksheet
Set curDatSht = currentWB.Worksheets("Data")
Set temLisSht = template.Worksheets("Person List")
i = 5
Dim j As Integer
j = 1
While Not IsEmpty(curResSht.Cells(i, 1))
If curResSht.Cells(i, 1).Interior.Color = curDatSht.Cells(2, 1).Interior.Color Then GoTo skipLine
If curResSht.Cells(i, 3).Value = "Total" Then GoTo skipLine
For k = 1 To 7
curResSht.Cells(i, k).Copy
temLisSht.Cells(j, k).PasteSpecial
Next k
j = j + 1
skipLine:
i = i + 1
Wend
Set temCom = temUtiSht.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, Left:=49, Top:=30, Width:=200, Height:=25)
template.Save
template.Close
Workbooks.Open (currentWB.Path & "\Template.xlsm")
Call fillEmpInLis
Call createCodeInTemplate
Application.Workbooks("Template.xlsm").Close savechanges:=True
End Sub
マクロ作成サブ:
サブ新しいブックを作成します
Sub createCodeInTemplate()
Dim tmWB As Workbook
Dim tmVP As VBProject
Dim tmVC As VBComponent
Dim tmCM As CodeModule
Set tmWB = Application.Workbooks("Template.xlsm")
Set tmVP = tmWB.VBProject
Set tmVC = tmVP.VBComponents("Sheet1")
Set tmCM = tmVC.CodeModule
With tmCM
.InsertLines 1, "Private Sub ComboBox1_Change()"
.InsertLines 2, vbTab & "Dim sht As Worksheet"
.InsertLines 3, vbTab & "Dim sht2 As Worksheet"
.InsertLines 4, vbTab & "Dim sht3 As Worksheet"
.InsertLines 5, vbTab & "Set sht = ThisWorkbook.Worksheets(""Utilisation"")"
.InsertLines 6, vbTab & "Set sht2 = ThisWorkbook.Worksheets(""Person List"")"
.InsertLines 7, vbTab & "Set sht3 = ThisWorkbook.Worksheets(""Holidays"")"
.InsertLines 8, vbTab & "Dim k As Integer"
.InsertLines 9, vbTab & "k = 4"
.InsertLines 10, vbTab & "Dim i As Integer"
.InsertLines 11, vbTab & "i = 5"
.InsertLines 12, vbTab & "Dim j As Integer"
.InsertLines 13, vbTab & "j = 1"
.InsertLines 14, vbTab & "While Not IsEmpty(sht.Cells(i, 1))"
.InsertLines 15, vbTab & vbTab & "i = i + 1"
.InsertLines 16, vbTab & "Wend"
.InsertLines 17, vbTab & "While Not IsEmpty(sht3.Cells(k, 1))"
.InsertLines 18, vbTab & vbTab & "k = k + 1"
.InsertLines 19, vbTab & "Wend"
.InsertLines 20, vbTab & "While Not IsEmpty(sht2.Cells(j, 1))"
.InsertLines 21, vbTab & vbTab & "If sht2.Cells(j, 1).Value = ComboBox1.Value Then"
.InsertLines 22, vbTab & vbTab & vbTab & "sht2.Rows(j).EntireRow.Copy"
.InsertLines 23, vbTab & vbTab & vbTab & "sht.Rows(i).EntireRow.PasteSpecial"
.InsertLines 24, vbTab & vbTab & vbTab & "sht2.Cells(i, 1).Copy"
.InsertLines 25, vbTab & vbTab & vbTab & "sht3.Cells(k, 2).PasteSpecial"
.InsertLines 26, vbTab & vbTab & vbTab & "sht2.Cells(i, 2).Copy"
.InsertLines 27, vbTab & vbTab & vbTab & "sht3.Cells(k, 1).PasteSpecial"
.InsertLines 28, vbTab & vbTab & vbTab & "k = k + 1"
.InsertLines 29, vbTab & vbTab & vbTab & "i = i + 1"
.InsertLines 30, vbTab & vbTab & "End If"
.InsertLines 31, vbTab & vbTab & "j = j + 1"
.InsertLines 32, vbTab & "Wend"
.InsertLines 33, "End Sub"
End With
End Sub
コンボボックスを埋めるサブ:
Sub fillEmpInLis()
Dim wb As Workbook
Dim utiSht As Worksheet
Dim perSht As Worksheet
Set wb = Application.Workbooks("Template.xlsm")
Set utiSht = wb.Worksheets("Utilisation")
Set perSht = wb.Worksheets("Person List")
Set box = wb.Sheets("Utilisation").ComboBox1
box.Clear
Dim i As Integer
i = 2
box.AddItem perSht.Cells(1, 1).Value
While Not IsEmpty(perSht.Cells(i, 1))
Dim resultIndex As Boolean
resultIndex = False
For j = 0 To box.ListCount - 1
If box.List(j) = perSht.Cells(i, 1).Value Then
resultIndex = True
End If
Next j
If resultIndex = False Then
For j = 0 To box.ListCount - 1
If perSht.Cells(i, 1) < box.List(j) And j = 0 Then
box.AddItem perSht.Cells(i, 1), j
GoTo skip
ElseIf perSht.Cells(i, 1) > box.List(j) And j = box.ListCount - 1 Then
box.AddItem perSht.Cells(i, 1)
GoTo skip
ElseIf perSht.Cells(i, 1) > box.List(j) And perSht.Cells(i, 1) < box.List(j + 1) Then
box.AddItem perSht.Cells(i, 1), j
GoTo skip
End If
Next j
skip:
End If
i = i + 1
Wend
End Sub
使用しているExcelのバージョンは何ですか? – Clusks
コード&コントロールを含むテンプレートブックを手動で作成してコード内で使用する方が簡単でしょうか?ユーザーが1枚のシートで新しいブックを作成するためのExcelオプションを設定している場合は、コードが失敗します。「祝日」と「人物リスト」の名前を変更するシートはありません。 –
私は、使用しているExcelバージョン(2007)を追加しました。 @ DarrenBartrup-Cookはい、それは簡単かもしれませんが、メインのワークブックに変更があり、ユーザーが新しいボタンを作成するためにボタンを押す方が簡単であれば、テンプレートを変更する必要があるので、新しいバージョンを毎回手動で作成するのではなく、テンプレートのバージョンを使用します。 – Bumpf