3

3 つのワークシートを含むワークブックがあります。1 つのワークシートには入力値 (現時点では作成されておらず、この質問には必要ありません) があり、1 つのワークシートにはいくつかの「テンプレート」または「ソース」テーブルがあり、最後のワークシートには 4 つの書式設定された「ターゲット」テーブル (空またはそうでない) があります。重要ではありません)。各テンプレート テーブルには 3 つの列があり、1 つの列は次の 2 つの列の値が何であるかを識別します。値の列には数式が含まれており、各セルには名前が付けられています。数式では、セル アドレスではなくセル名が使用されます (たとえば、C2 ではなく MyData1)。

ソースからターゲットにセル名をコピーするか、ソースセル名に基づいてターゲットテーブルに名前を作成しながら、テンプレートをターゲットテーブルにコピーしようとしています。以下の私のコードは、名前に「ベース」を使用してターゲット名を作成しています。これは、コピー先のターゲットテーブルに応じて変更されます。私のサンプル テーブルには、すべてのセル名 (Num0_MyData1、Num0_SomeOtherData2 など) のベースに "Num0_" があります。コピーが完了すると、コードはターゲットの名前 (およびアドレス) を調べてセルに名前を付け、名前のベースを新しいベースに置き換え、コピー先のターゲット テーブルの番号を追加し、シートを置き換えます。住所に名前。

ここで助けが必要です。そのアドレスを変更する方法は、テンプレートとターゲットがパースペクティブ シートの同じセル アドレスを使用している場合にのみ機能します。彼らはそうではありません。(たとえば、Template1 テーブルには、B2 から C10 までのそれぞれに名前が付けられた値セルがあり、コピーのターゲット テーブルは F52 から G60 である可能性があります)。要するに、これらの名前をテンプレートにコピーする方法、またはターゲット テーブルに基づいてアドレス値をインクリメントする置換などを実行してセルに動的に名前を付ける方法を理解する必要があります #...4 つのターゲット テーブルがあることを思い出してください。静的なので、それらの領域にのみコピーします。私はVBAが初めてなので、提案や助けをいただければ幸いです。

注:テーブルのコピーは思い通りに機能します。セルにも名前を付けます (テンプレートとターゲット テーブルが同じローカル ワークシート セル アドレス (例: C2) を持っている場合)

'Declare Module level variables
'Variables for target tables are defined in sub's for each target table.
Dim cellName As Name
Dim newName As String
Dim newAddress As String
Dim newSheetVar
Dim oldSheetVar
Dim oldNameVar
Dim srcTable1

Sub copyTables()

newSheetVar = "TestSheet"
oldSheetVar = "Templates"
oldNameVar = "Num0_"
srcTable1 = "TestTableTemplate"

'Call sub functions to copy tables, name cells and update functions.
copySrc1Table
copySrc2Table
End Sub

'****there is another sub identical to this one below for copySrc2Table. 
Sub copySrc1Table()

newNameVar = "Num1_"
trgTable1 = "SourceEnvTable1"
    Sheets(oldSheetVar).Select
    Range(srcTable1).Select
    Selection.Copy
    For Each cellName In ActiveWorkbook.Names
    'Find all names with common value
        If cellName.Name Like oldNameVar & "*" Then
      'Replace the common value with the update value you need
        newName = Replace(cellName.Name, oldNameVar, newNameVar)
        newAddress = Replace(cellName.RefersTo, oldSheetVar, newSheetVar)
      'Edit the name of the name. This will change any formulas using this name as well
        ActiveWorkbook.Names.Add Name:=newName, RefersTo:=newAddress
        End If
    Next cellName
    Sheets(newSheetVar).Select
    Range(trgTable1).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False

End Sub
4

2 に答える 2

0

newAdress を設定する行の find メソッドを削除する copySrc1Table() プロシージャを更新しました。これを、最初にソース cellname.refers to value に設定された文字列に置き換えました。この値は新しいサブ (サブ UpdateRefersTo) に送信され、その値が目的の値に変更され、これを使用して newAdress 値が設定されます。

'****there is another sub identical to this one below for copySrc2Table.
Sub copySrc1Table()
Dim trgTable1
Dim vSplitAdress As Variant
Dim sRefersTo As String

newNameVar = "Num1_"
trgTable1 = "SourceEnvTable1"
    Sheets(oldSheetVar).Select
    Range(srcTable1).Select
    Selection.Copy
    Sheets(newSheetVar).Select
    Range(trgTable1).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False

    For Each cellName In ActiveWorkbook.Names
    'Find all names with common value
        If cellName.Name Like oldNameVar & "*" Then
      'Replace the common value with the update value you need
        sRefersTo = cellName.RefersTo
        Call UpdateRefersTo(sRefersTo)
        newName = Replace(cellName.Name, oldNameVar, newNameVar)
        newAddress = sRefersTo
      'Edit the name of the name. This will change any formulas using this name as well
        ActiveWorkbook.Names.Add Name:=newName, RefersTo:=newAddress
        End If
    Next cellName

これは case 要素を使用して行われるため、テンプレート ワークシートの各アドレスに対して、範囲という名前のテスト シートが何を参照するかについて case ステートメントを記述する必要があります。エレガントなソリューションではありませんが、うまくいくはずです。もちろん、新しいテーブルの関数を変更する必要がありますが、それほど難しくはありません。

End Sub

Sub UpdateRefersTo(ByRef sRefersTo As String)
Dim sString As String

Select Case sRefersTo
    Case "=Templates!$B$2"
        sRefersTo = "=TestSheet!$F$52"
    Case "=Templates!$B$3"
        sRefersTo = "=TestSheet!$F$53"
    Case "=Templates!$B$4"
        sRefersTo = "=TestSheet!$F$54"
    Case "=Templates!$B$5"
        sRefersTo = "=TestSheet!$F$55"
    Case "=Templates!$B$6"
        sRefersTo = "=TestSheet!$F$56"
    Case "=Templates!$B$7"
        sRefersTo = "=TestSheet!$F$57"
    Case "=Templates!$B$8"
        sRefersTo = "=TestSheet!$F$58"
    Case "=Templates!$B$9"
        sRefersTo = "=TestSheet!$F$59"
    Case "=Templates!$B$10"
        sRefersTo = "=TestSheet!$F$60"
    Case "=Templates!$C$2"
        sRefersTo = "=TestSheet!$G$52"
    Case "=Templates!$C$3"
        sRefersTo = "=TestSheet!$G$53"
    Case "=Templates!$C$4"
        sRefersTo = "=TestSheet!$G$54"
    Case "=Templates!$C$5"
        sRefersTo = "=TestSheet!$G$55"
    Case "=Templates!$C$6"
        sRefersTo = "=TestSheet!$G$56"
    Case "=Templates!$C$7"
        sRefersTo = "=TestSheet!$G$57"
    Case "=Templates!$C$8"
        sRefersTo = "=TestSheet!$G$58"
    Case "=Templates!$C$9"
        sRefersTo = "=TestSheet!$G$59"
    Case "=Templates!$C$10"
        sRefersTo = "=TestSheet!$G$60"

End Select

End Sub
于 2013-08-29T18:26:12.290 に答える