2

私の会社では、Excel を使用して、すべての店舗に送信されるネットワーク構成を作成しています。Excel の変数シートに入力されるいくつかの変数を除いて、構成はほとんど同じです。ユーザーがコマンド ボタンをクリックすると、出来上がり。変数が構成に配置され、ワー​​クブックに新しいシートが作成されます。これは何年もの間私たちのために働いていました。しかし、最近 Office 2013 にアップグレードしたところ、構成テンプレートがどれも機能しなくなりました。コードにはそれほど多くはないので、これは比較的簡単かもしれませんが、私はプログラマーではありません。コードは次のとおりです。

Public Sub ReplaceValues(OriginalSheetName As String, VariableSheetName As String, NewSheetName As String)
Dim iVariableRowCounter As String
Dim sSearchValue As String
Dim sReplacementValue As String
Dim iControlCounter As Integer

ThisWorkbook.Sheets(OriginalSheetName).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = NewSheetName

For iControlCounter = ThisWorkbook.Sheets(NewSheetName).Shapes.Count To 1 Step -1
    If ThisWorkbook.Sheets(NewSheetName).Shapes(iControlCounter).Type = msoOLEControlObject Then
        ThisWorkbook.Sheets(NewSheetName).Shapes(iControlCounter).Delete
    End If
Next

iVariableRowCounter = 2

While ThisWorkbook.Sheets(VariableSheetName).Cells(iVariableRowCounter, 1).Value <> ""
    sSearchValue = ThisWorkbook.Sheets(VariableSheetName).Cells(iVariableRowCounter, 1).Value
    sReplacementValue = ThisWorkbook.Sheets(VariableSheetName).Cells(iVariableRowCounter, 2).Value

    ThisWorkbook.Sheets(NewSheetName).UsedRange.Replace what:=sSearchValue, replacement:=sReplacementValue, searchorder:=xlByColumns, MatchCase:=False, lookat:=xlPart

    iVariableRowCounter = iVariableRowCounter + 1
Wend
End Sub

Public Function GenerateNewWorksheetName(OriginalSheetName As String) As String
Dim sNewSheetName As String
Dim iIncrement As Integer
Dim iSheetCounter As Integer
Dim bGoodName As Boolean
Dim bSheetFound As Boolean

iIncrement = 1
bGoodName = False

While Not bGoodName
    sNewSheetName = OriginalSheetName & " - " & iIncrement
    bSheetFound = False

    For iSheetCounter = 1 To ThisWorkbook.Sheets.Count
        If ThisWorkbook.Sheets(iSheetCounter).Name = sNewSheetName Then
            bSheetFound = True
            Exit For
        End If
    Next

    If Not bSheetFound Then
        bGoodName = True
    End If

    iIncrement = iIncrement + 1
Wend

GenerateNewWorksheetName = sNewSheetName
End Function

どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1

1

アップグレード時にエラーが発生すると、コードが事前バインディングを使用している可能性があると思います (ただし、私が目にする唯一の参照は と のような定数でmsoOLEControlObjectありxlByColumns、それらが原因で Copy が失敗する理由はわかりません)。VBA で参照を確認するか、遅延バインディングへの変換を検討する必要がある場合があります。残念ながら、ここで説明するのは少し複雑です。

もう 1 つの可能性は、VBA の新しいバージョンで Copy が変更されたことです (私自身はまだ 2007 年です)。カーソルが Copy という単語の上にあるときに F1 を押すと、それがどのように機能するかを確認できます。

いずれにせよ、あなたはおそらく少しプログラミングを学んでいるでしょう! ;)

于 2013-07-30T14:12:29.070 に答える