Anstatt Zellen kopieren, auswählen und einfügen (unterer Code), möchte ich Bereiche direkt zuweisen und das Blatt ausblenden, auf das Werte gefüllt werden.Wie Sie mit Excel VBA Werte von einem Blatt in ein ausgeblendetes Blatt zuweisen? (und eine Spalte innerhalb des Bereichs auslassen?)
Ich denke, das Blatt kann einfach aus der Sicht ausgeblendet werden und das Makro, um die Werte basierend auf anderen Blattbereichen zu füllen, wird immer noch funktionieren, oder?
Beim Versuch, Werte auf einem anderen Blatt zuzuweisen, möchte ich auf diesem Arbeitscode aufbauen (mit thanks to Jason Faulkner and aoswald). (Ich muss die Zellen nach einer leeren Spalte aus der letzten Menge von Werten platzieren. Idealerweise weist der Code Werte von A13: C## (bis zur letzten gefüllten Zeile) und ebenfalls E13: E ## unmittelbar danach zu (dh Entfernen der Spalte D .., wenn die Werte auf das versteckte Blatt zuweisen)
Private Sub CommandButton1_Click()
Dim DataRange As Variant, Constraint_sheet As Worksheet, Private_sheet As Worksheet
Set Constraint_sheet = Sheets("Constraint Sheet")
Set Private_sheet = Sheets("Private")
DataRange = Constraint_sheet.Range("A13:C300").Value
With Private_sheet
.Range(.Range("XFD1").End(xlToLeft).Offset(0, 3), .Range("XFD1").End(xlToLeft).Offset(287, 2)) = DataRange
End With
End Sub
Hier Code arbeitet, die ich zu ersetzen versuchen und zu vereinfachen, wie oben angegeben gibt es weitere Vereinfachungen, die gemacht werden können
Private Sub CommandButton1_Click()
Dim MyPassword As String, Private_sheet As Worksheet
Set Private_sheet = Sheets("Private")
MyPassword = "string"
If InputBox("Please enter the password to continue.", "Enter Password") <> MyPassword Then
Exit Sub
End If
Private_sheet.Unprotect MyPassword ' apparently causes clipboard to be erased so do before copying cells
Columns("B:E").Select
Application.CutCopyMode = False
Selection.Copy
Private_sheet.Select
Private_sheet.Range("XFD1").End(xlToLeft).Offset(0, 3).Select
ActiveCell.PasteSpecial
ActiveCell.CurrentRegion.EntireColumn.Locked = True
ActiveCell.CurrentRegion.Offset(0, -1).EntireColumn.Locked = True
Private_sheet.Protect MyPassword
ActiveWorkbook.Save
End Sub
bearbeiten?: Hier ist der Arbeitscode, den ich entwickelt habe, um den obigen Code zu ersetzen.Welche weiteren Verbesserungen und Vereinfachungen können vorgenommen werden?
Private Sub AddTemplate_Click()
Dim Exposed_sheet As Worksheet, Hidden_sheet As Worksheet, MyPassword As String
Set Exposed_sheet = Sheets("Exposed Sheet")
Set Hidden_sheet = Sheets("Hidden")
MyPassword = "string"
'Reference: carriage return in msgbox http://www.ozgrid.com/forum/showthread.php?t=41581
If InputBox("Please enter the password to continue." & vbNewLine & vbNewLine _
& "Note: The string you type will be exposed, i.e. not '***'." & vbNewLine _
& "Note: This will save the Excel file!", "Enter Password: Enter the correct string.") <> MyPassword Then
Exit Sub
End If
' Reference: .Protect - https://stackoverflow.com/questions/11746478/excel-macro-run-time-error-1004
Hidden_sheet.Unprotect MyPassword
'References:
' dynamic referencing: https://stackoverflow.com/questions/45889866/how-to-assign-values-from-one-sheet-into-hidden-sheet-using-excel-vba-and-skip/45889960#45889960
' adding text: https://stackoverflow.com/questions/20612415/adding-text-to-a-cell-in-excel-using-vba
' Union to exclude column: https://stackoverflow.com/questions/2376995/exclude-some-columns-while-copying-one-row-to-other
With Hidden_sheet
.Cells(1, Columns.Count).End(xlToLeft).Offset(1, 3).Resize(UBound(Exposed_sheet.Range("B6", "D9").Value, 1), UBound(Exposed_sheet.Range("B6", "D9").Value, 2)).Value = Exposed_sheet.Range("B6", "D9").Value
.Cells(1, Columns.Count).End(xlToLeft).Offset(1, 6).Value = "Volume/Protocol"
.Cells(1, Columns.Count).End(xlToLeft).Offset(6, 3).Resize(UBound(Union(Exposed_sheet.Range("A13:C300"), Exposed_sheet.Range("E13:E300")).Value, 1), UBound(Union(Exposed_sheet.Range("A13:C300"), Exposed_sheet.Range("E13:E300")).Value, 2)).Value = Union(Exposed_sheet.Range("A13:C300"), Exposed_sheet.Range("E13:E300")).Value
' If you change the order putting this prior, you must change the offsets or the cell they count from. -- DB, Aug 28 2017
.Cells(1, Columns.Count).End(xlToLeft).Offset(0, 3).Resize(1, 3).Merge
.Cells(1, Columns.Count).End(xlToLeft).Offset(0, 3).Value = Exposed_sheet.Range("A1").Value
End With
Hidden_sheet.Protect MyPassword
ActiveWorkbook.Save
End Sub
Was für eine aktive Community und schnelle Antwort! Du hast diese Antwort gepostet, bevor ich mein OP bearbeiten konnte, um dieselbe Lösung zu implementieren, die ich in verwandten Fragen gefunden habe. Ich hoffe immer noch auf weitere Verbesserungen dieses Codes. (Ich werde das OP, sobald ich eine vollständigere Implementierung habe, die den letzteren Code vereinfacht.) – DBinJP
Wenn ich diesen 'einfacheren/flexibleren' Code versuche, bekomme ich den Fehler 'Laufzeitfehler 424: Objekt benötigt'. Ich frage mich, ob DataRange für ein anderes Arbeitsblatt mit 'mit' definiert wurde und irgendwie diese Verbindung verloren ging, wenn sie in einem anderen 'mit' verwendet wurde (d. H. 'Mit' Angabe eines anderen Blattes). Aber wenn ich das Blatt, sheetame.DataRange, spezifiziere, wird 'Methode oder Datenelement nicht gefunden' angezeigt. – DBinJP
Ja, das habe ich vermasselt und vergessen, 'DataRange' war ein Array und kein Bereich. Siehe oben Bearbeiten. –