2012-02-20 6 views
1

Excel 2003で完全に正常に動作する以下のコードがVBAにあります。 テンプレートをExcel 2007に移行すると機能しません。Excel VBA非互換性カーネル32呼び出し

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long 
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As Any, ByVal lpFileName As String) As Long 

Private Sub Workbook_Open() 
Exit Sub 


Dim WorksheetName As String 
Dim WorksheetCell As String 
Dim Section As String 
Dim kKey As String 
Dim lLine As Long 
Dim InvoiceNumber As Long 
Dim InvoiceNumberCell As Object 
Dim TemplateName As String 
Dim IniFileName As String 
Dim Dummy As Variant 

    TemplateName = "MyInvoicesTemplate.xlt" 
    WorksheetName = "Invoice" 
    WorksheetCell = "H2" 
    Section = "Invoice" 
    kKey = "Number" 
    IniFileName = "C:\Windows\Temp\InvoiceNumber.txt" 

    Set InvoiceNumberCell = Worksheets(WorksheetName).Range(WorksheetCell) 
    If UCase(ActiveWorkbook.Name) = UCase(TemplateName) Then GoTo Finito 
    Dummy = GetString(Section, kKey, IniFileName) 
    If Left(Dummy, 1) = Chr$(0) Then 
     InvoiceNumber = 1 
    Else 
     InvoiceNumber = CLng(Dummy) + 1 
    End If 
    WritePrivateProfileString Section, kKey, CStr(InvoiceNumber), IniFileName 
    InvoiceNumberCell.Value = InvoiceNumber 
    With ActiveWorkbook.VBProject.VBComponents(ActiveWorkbook.CodeName).CodeModule 
     lLine = .ProcBodyLine("Workbook_Open", vbext_pk_Proc) 
     .InsertLines lLine + 1, "Exit Sub" 
    End With 
Finito: 
Set InvoiceNumberCell = Nothing 
End Sub 

Function GetString(Section As String, Key As String, File As String) As String 
    Dim KeyValue As String 
    Dim Characters As Long 
    KeyValue = String(255, 0) 
    Characters = GetPrivateProfileString(Section, Key, "", KeyValue, 255, File) 
    If Characters > 1 Then 
     KeyValue = Left(KeyValue, Characters) 
    End If 
    GetString = KeyValue 
End Function 

なぜこのようなことが起こりますか? 私は違うフォーマットでテンプレートを保存しようとしましたが、運はありませんでした!

ありがとうございました。 MK

+0

ディックKusleikaリンクなど、ptrSafeLongPtrを宣言するには、間違いなくあなたを助けます。また、Private Sub Workbook_Open()の初めに「Exit Sub」を持っているのはなぜですか? –

答えて

3

64ビットOfficeを使用している場合は、APIが変更されています。

http://www.jkp-ads.com/articles/apideclarations.asp

+0

+1ユーザが64ビットについては言及していませんが、エラーメッセージがすべて消えてしまいます:) –

0

APIが変更されている参照してください。

VBA7場合は、

関連する問題