2016-09-29 3 views
0

私の状況:ファイル拡張子として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 
+0

使用しているExcelのバージョンは何ですか? – Clusks

+1

コード&コントロールを含むテンプレートブックを手動で作成してコード内で使用する方が簡単でしょうか?ユーザーが1枚のシートで新しいブックを作成するためのExcelオプションを設定している場合は、コードが失敗します。「祝日」と「人物リスト」の名前を変更するシートはありません。 –

+0

私は、使用しているExcelバージョン(2007)を追加しました。 @ DarrenBartrup-Cookはい、それは簡単かもしれませんが、メインのワークブックに変更があり、ユーザーが新しいボタンを作成するためにボタンを押す方が簡単であれば、テンプレートを変更する必要があるので、新しいバージョンを毎回手動で作成するのではなく、テンプレートのバージョンを使用します。 – Bumpf

答えて

0

私はこれが役立つことを願っています:

私の推測では、保存されたときに、マクロコードが正しくテンプレートで作成されていないということです。だから、僕は空のワークブックにあなたのコードをコピーして、あなたのマクロコードを作成するサブでこれらの変更を行った:

Sub createCodeInTemplate() 
    Dim tmWB As Workbook 

    Set tmWB = Application.Workbooks("Template.xlsm") 

    With tmWB.VBProject.VBComponents(tmWB.Sheets("Utilisation").CodeName).CodeModule 

私は、完全なコードをテストし、作成したファイル(Template.xlsm)を含むましたマクロコード。

私はExcel 2013を使用しているため、役に立たないかもしれませんが、試してみてください。

+0

答えをありがとうが、それは私のためには動作しません。主な闘争のポイントはまだ保存と閉鎖になるだろうと私は推測する。なぜなら、私がそれを閉じることがなければ、コードはシートの中にあるからだ。 コードを確認した後で手動で保存しても、コードが消えてしまいます。 – Bumpf

関連する問題