在 Excel 中使用 VBA 移动命名范围

问题描述 投票:0回答:1

我被困住了。我有一个电子表格,它使用 Vlookup 和索引公式并引用命名范围,根据另一个单元格中的 ID 号返回结果。这有效。但是,我正在使用 VBA 来“翻译”电子表格...这只是删除命名范围,然后将它们重新添加到另一个工作表(代码可以在两个工作表之间切换 - 引用保持不变,但工作表发生变化介于德语和英语表之间)。这些工作表都被重新命名,并且未引用的工作表被隐藏。

一切似乎都按计划进行,但是具有 Vlookup/index 公式的单元格几乎在所有单元格中都返回 #ref 错误(但奇怪的是,不是所有使用对命名范围的引用的公式。)。当我切换回原始语言时,公式就起作用了。

不起作用的公式是:

=INDEX(Leistungen;VERGLEICH($B4;IDs;0))  

(英语等效为 =INDEX(Leistungen,MATCH($B4,IDs,0))

Leistungen 和 ID 是移动的命名范围。

奇怪的是,这个公式在宏运行后才有效:

=INDEX(Rhythmus;VERGLEICH($B4;IDs;0))

我在这里缺少什么重要的东西吗?我可以在下拉菜单中看到命名范围,当我单击它们时,Excel会将我带到它们,但是当我尝试引用编辑栏中的命名范围时,它们不在那里,但当我将它们移回时又重新出现回到原来的位置...

我尝试完全删除所有引用的命名范围,然后重新添加它们(使用vba),并且我还尝试简单地使用 Thisworkbook.Names("Name").refersto = range 进行编辑现有命名范围的引用,但两者返回相同的结果。

手动更改引用的单元格可以得到所需的结果。

我的猜测是,命名范围在 Excel 中的某个位置有某种锚点,不受此过程的影响,因为将它们返回到原始位置会再次起作用。

我正在使用 Excel 2016。如果它能正常工作我会很高兴!!

这是完整的代码...

Sub Translate()

Dim wb As Workbook

Dim Leistungen_This As Worksheet
Dim Leistungen_New As Worksheet
Dim ws As Worksheet
Dim at As Worksheet

Set wb = ThisWorkbook
Set ws = wb.Worksheets("Stammdaten")
Set at = wb.Worksheets("Auftrag")

Dim N As Name

Dim idRng As Range
Dim leistIDRng As Range
Dim groupNameRng As Range
Dim leistRng As Range
Dim rtmRng As Range

Dim VerrStzRng As Range
Dim VersRng As Range
Dim VersNRng As Range

Dim idAd As String
Dim leistIDAd As String
Dim groupNameAd As String
Dim leistAd As String
Dim rtmAd As String

Dim VerrStzAd As String
Dim VersAd As String
Dim VersNAd As String

Dim sprache As String
sprache = at.Range("Sprache").Value

If sprache = "English" Then

            Application.ScreenUpdating = False
                        
            Set Leistungen_This = wb.Worksheets("Leistungen_EN")
            Set Leistungen_New = wb.Worksheets("Leistungen_DE")
            
            Leistungen_This.Unprotect Password:="Treuhand123!"
            Leistungen_New.Unprotect Password:="Treuhand123!"
                                                 
            Leistungen_This.Visible = xlSheetHidden
            Leistungen_New.Visible = xlSheetVisible
            
            idAd = Leistungen_This.Range("IDs").Address
            leistIDAd = Leistungen_This.Range("LeistungID").Address
            groupNameAd = Leistungen_This.Range("GruppenName").Address
            leistAd = Leistungen_This.Range("Leistungen").Address
            rtmAd = Leistungen_This.Range("Rhythmus").Address
            
            VerrStzAd = Leistungen_New.Range("verrsatz").Address 'Following 3 Named ranges are always on the sheet Leistungen_DE, but must be re-added incase a new version of sheet is re-added.
            VersAd = Leistungen_New.Range("versionLeist").Address
            VersNAd = Leistungen_New.Range("versionNum").Address
                        
            Set idRng = Leistungen_New.Range(idAd)
            Set leistIDRng = Leistungen_New.Range(leistIDAd)
            Set groupNameRng = Leistungen_New.Range(groupNameAd)
            Set leistRng = Leistungen_New.Range(leistAd)
            Set rtmRng = Leistungen_New.Range(rtmAd)
            
            Set VerrStzRng = Leistungen_New.Range(VerrStzAd)
            Set VersRng = Leistungen_New.Range(VersAd)
            Set VersNRng = Leistungen_New.Range(VersNAd)
               
            With at
                .Range("A2").Value = "Summe lfd Leistungen:"
                .Range("A3").Value = "Summe Extras:"
                .Range("A4").Value = "Gesamtsumme:"
                .Range("A5").Value = "abzgl. Rabatt lfd. Leistungen:"
                .Range("A6").Value = "zzgl. Last-Minute Zuschläg:"
                .Range("C2").Value = "Klient:"
                .Range("C3").Value = "Klientnummer:"
                .Range("C4").Value = "Sacharbeiter:"
                .Range("C5").Value = "Datum:"
                .Range("C6").Value = "Zeitraum:"
                .Range("E2").Value = "Verr. Satz"
                .Range("A8").Value = "Gruppenname"
                .Range("B8").Value = "Anzahl "
                .Range("C8").Value = "Leistung"
                .Range("D8").Value = " Preis"
                .Range("E8").Value = " Zeit"
            End With
            
            Call DeleteSheetNRanges 'This deletes all Named Ranges which reference cells in any sheet with 'Leistungen' in the sheet name.
            
            With ThisWorkbook.Names
            
                .Add Name:="IDs", RefersTo:=idRng, Visible:=True
                .Add Name:="Leistungen", RefersTo:=leistIDRng, Visible:=True
                .Add Name:="Gruppenname", RefersTo:=groupNameRng, Visible:=True
                .Add Name:="LeistungID", RefersTo:=leistRng, Visible:=True
                .Add Name:="Rhythmus", RefersTo:=rtmRng, Visible:=True
               
                .Add Name:="verrsatz", RefersTo:=VerrStzRng, Visible:=True
                .Add Name:="versionLeist", RefersTo:=VersRng, Visible:=True
                .Add Name:="versionNum", RefersTo:=VersNRng, Visible:=True
                
            End With

            On Error GoTo 0
            
            at.Range("Sprache").Value = "Deutsch"
                                 
'           Leistungen_This.Protect Password:="Treuhand123!"  ' currently deactivated for test purposes.
'           Leistungen_New.Protect Password:="Treuhand123!"
                               
            'Call Aktualisieren   'another function from sheet which moves and delete cells, has no effect on named ranges.
                               
            Application.ScreenUpdating = True
            
            Exit Sub
            
    Else
            
            Application.ScreenUpdating = False
                        
            Set Leistungen_This = wb.Worksheets("Leistungen_DE")
            Set Leistungen_New = wb.Worksheets("Leistungen_EN")
            
            Leistungen_This.Unprotect Password:="Treuhand123!"
            Leistungen_New.Unprotect Password:="Treuhand123!"
                                                       
            Leistungen_This.Visible = xlSheetHidden
            Leistungen_New.Visible = xlSheetVisible
            
            idAd = Leistungen_This.Range("IDs").Address
            leistIDAd = Leistungen_This.Range("LeistungID").Address
            groupNameAd = Leistungen_This.Range("GruppenName").Address
            leistAd = Leistungen_This.Range("Leistungen").Address
            rtmAd = Leistungen_This.Range("Rhythmus").Address
            
            VerrStzAd = Leistungen_This.Range("verrsatz").Address
            VersAd = Leistungen_This.Range("versionLeist").Address
            VersNAd = Leistungen_This.Range("versionNum").Address
            
            Set idRng = Leistungen_New.Range(idAd)
            Set leistIDRng = Leistungen_New.Range(leistIDAd)
            Set groupNameRng = Leistungen_New.Range(groupNameAd)
            Set leistRng = Leistungen_New.Range(leistAd)
            Set rtmRng = Leistungen_New.Range(rtmAd)
            
            Set VerrStzRng = Leistungen_This.Range(VerrStzAd)
            Set VersRng = Leistungen_This.Range(VersAd)
            Set VersNRng = Leistungen_This.Range(VersNAd)
              
            With at
                .Range("A2").Value = "Total acct. services:"
                .Range("A3").Value = "Total extras:"
                .Range("A4").Value = "Sum Total:"
                .Range("A5").Value = "- discount acct. services:"
                .Range("A6").Value = "+ last-minute surcharge:"
                .Range("C2").Value = "Client:"
                .Range("C3").Value = "Client number:"
                .Range("C4").Value = "Employee:"
                .Range("C5").Value = "Date:"
                .Range("C6").Value = "Period:"
                .Range("E2").Value = "Hourly Rate"
                .Range("A8").Value = "Category"
                .Range("B8").Value = "Quantity"
                .Range("C8").Value = "Service"
                .Range("D8").Value = "Price"
                .Range("E8").Value = "Time"
            End With
            
            Call DeleteSheetNRanges
            
            With ThisWorkbook.Names
            
                .Add Name:="IDs", RefersTo:=idRng, Visible:=True
                .Add Name:="Leistungen", RefersTo:=leistIDRng, Visible:=True
                .Add Name:="Gruppenname", RefersTo:=groupNameRng, Visible:=True
                .Add Name:="LeistungID", RefersTo:=leistRng, Visible:=True
                .Add Name:="Rhythmus", RefersTo:=rtmRng, Visible:=True
            
                .Add Name:="verrsatz", RefersTo:=VerrStzRng, Visible:=True
                .Add Name:="versionLeist", RefersTo:=VersRng, Visible:=True
                .Add Name:="versionNum", RefersTo:=VersNRng, Visible:=True
            
            End With
            
            On Error GoTo 0
            
            
            at.Range("Sprache").Value = "English"
                        
'            Leistungen_This.Protect Password:="Treuhand123!"
'            Leistungen_New.Protect Password:="Treuhand123!"
'
            'Call Aktualisieren
            
            Application.ScreenUpdating = True
     End If
    
Exit Sub
    
fuckit:

Application.ScreenUpdating = True

Dim ErrorMessage As String
ErrorMessage = "An error occurred: " & Err.Description
MsgBox ErrorMessage, vbExclamation, "Error"

End Sub
excel vba excel-2016 named-ranges
1个回答
0
投票

变量引用中的简单错误。案件结案。学习到教训了。感谢社区!! 🙏

© www.soinside.com 2019 - 2024. All rights reserved.