Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1704to1708
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Type Anweisung

Type Anweisung
26.07.2019 08:57:42
Marvin
Hallo zusammen,
ich habe folgendes Problem. Ich habe einen eigenen Type deklariert und eine Funktion in einem Modul geschrieben, wo mir unter einer bestimmten Bedingung worksheets raus geschrieben werden. Mein definierter Typ soll sich dabei aus dem Namen des Worksheets und der Position, wo es sich in der Arbeitsmappe befindet, zusammensetzen. Das Klappt soweit auch ganz gut. [Code 1].
Jetzt möchte ich diese Funktion in einem anderen Sub aufrufen und mir nur den Namen der Worksheets per Drop Down anzeigen lassen. [Code 2] Hier ist mein Problem. Ich bekomme die die Variable, die als mein Type definiert wurde, nicht in mein anderes Sub und dann auch nicht nur den Namen der worksheets. Ich hoffe ihr konntet mein Problem verstehen.
Hier meine Codes:
Code 1:
'##########################################################'
'Define own Type fpr Projectsheets array'
'##########################################################'
Public Type Projecttyp
Name As String
Selected As Boolean
Index As String
End Type
'##########################################################'
'Compare all Worksheet Names with a defined Cellname. If the Worksheet Name is like the Name in _ the defined Cell then put all Sheets in one Array'

Public Function Projectarray() As String
Dim wsName() As Projecttyp
Dim Sheetname As String
Dim Cellname As String
Dim i, j As Integer
Dim Compare As Integer
'Workbook.Open
'Compare Name from all Worksheets with Cellname in defined Cell'
For i = 1 To ThisWorkbook.Worksheets.Count
Sheetname = Sheets(i).Name
Cellname = Sheets(i).Range("D2")
Compare = InStr(1, Cellname, Sheetname, vbTextCompare)
'All Names from Worksheets which are like the Name in the defined Cell are listed in array  _
wsName()'
If Compare > 0 Then
j = j + 1
ReDim wsName(1 To j) As Projecttyp
With wsName(j)
.Name = Sheets(i).Name
.Index = i
End With
'List the different Elements for Projecttyp in Cells'
Cells(j, 1) = wsName(j).Name
Cells(j, 2) = wsName(j).Index
End If
Next i
End Function

Code 2:
Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rend, Rstart As Integer
Dim DDName As String
Dim j As Integer
Application.ScreenUpdating = False
Call Projectarray
Rstart = 5
Rend = Rstart + 200
'#####################################################
'Hier sollen meine Namen aufgelistet werden für die Drop Down liste aus dem Code 1
'###########################################################
DDName = Join(wsName().Name, ",")
If Intersect(Target, Range("B" & Rstart & " :B" & Rend)) Is Nothing Then Exit Sub
With ActiveCell
.Validation.Delete
.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlGreater, Formula1:=DDName
.Validation.IgnoreBlank = True
.Validation.InCellDropdown = True
.Validation.ShowInput = True
End With

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Type Anweisung
26.07.2019 09:38:33
Nepumuk
Hallo Marvin,
auf einen benutzerdefinierten Typ kannst du keine Join-Funktion anwenden.
1. Du musst in einer Schleife die Namen in einen String zusammenbauen.
2. Du musst das Array als Rückgabewert der Funktion definieren.
3. In der Funktion musst du die Einträge in Array behalten (Preserve).
4. In einer Dim-Anweisung musst du jeder Variablen explicit einen Datentyp zuweisen (Dim a as Long,b as Long).
5. Du solltest deine numerischen Variablen, außer z.B. eine VBA-Funktion gibt einen Integer zurück oder du benötigst sie für größere Zahlen, immer als Long deklarieren. Die sind in VBA erheblich schneller als Integer-Variablen und die 2 Byte die du da sparst spielen nun wirklich keine Rolle da du in VBA 500MB Speicher für Makros zur Verfügung hast.
ich war so frei deinen Code zu korrigieren:
Option Explicit

Public Type Projecttyp
    
    Name As String
    Selected As Boolean
    Index As String
    
End Type

'##########################################################'
'Compare all Worksheet Names with a defined Cellname. If the Worksheet Name is like the Name in _ the defined Cell then put all Sheets in one Array'
Public Function Projectarray() As Projecttyp()
    
    Dim wsName() As Projecttyp
    Dim Sheetname As String
    Dim Cellname As String
    Dim i As Long, j As Long
    Dim Compare As Long
    
    'Workbook.Open
    
    'Compare Name from all Worksheets with Cellname in defined Cell'
    For i = 1 To ThisWorkbook.Worksheets.Count
        Sheetname = Sheets(i).Name
        Cellname = Sheets(i).Range("D2")
        Compare = InStr(1, Cellname, Sheetname, vbTextCompare)
        
        'All Names from Worksheets which are like the Name in the defined Cell are listed in array _
            wsName()'

        If Compare > 0 Then
            j = j + 1
            Redim Preserve wsName(1 To j)
            With wsName(j)
                .Name = Sheets(i).Name
                .Index = i
            End With
            
            'List the different Elements for Projecttyp in Cells'
            Cells(j, 1) = wsName(j).Name
            Cells(j, 2) = wsName(j).Index
        End If
    Next i
    Projectarray = wsName
End Function

Option Explicit

Private Declare PtrSafe Function SafeArrayGetDim Lib "oleaut32.dll" ( _
    ByRef psa() As Any) As Long

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    Dim Rend As Long, Rstart As Long
    Dim DDName As String
    Dim j As Long
    Dim wsName() As Projecttyp
    
    Rstart = 5
    Rend = Rstart + 200
    
    If Not Intersect(Target, Range("B" & Rstart & " :B" & Rend)) Is Nothing Then
        
        wsName = Projectarray
        
        If SafeArrayGetDim(wsName) <> 0 Then
            
            Application.ScreenUpdating = False
            
            For j = LBound(wsName) To UBound(wsName)
                DDName = DDName & wsName(j).Name & ","
            Next
            
            DDName = Left$(DDName, Len(DDName) - 1)
            
            With ActiveCell
                .Validation.Delete
                .Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                    Operator:=xlGreater, Formula1:=DDName
                .Validation.IgnoreBlank = True
                .Validation.InCellDropdown = True
                .Validation.ShowInput = True
            End With
            Application.ScreenUpdating = True
        End If
    End If
End Sub

Die Schleife im Worksheet_SelectionChange läuft in einen Fehler, wenn die Funktion kein Array zurück gibt. Ich habe daher eine Prüfung eingebaut (SafeArrayGetDim).
Gruß
Nepumuk
Anzeige
AW: Type Anweisung
26.07.2019 10:11:36
Marvin
Hallo Nepumuk,
Vielen Dank für die Hilfe und die Erklärung. Du hast mir extrem geholfen! Ich wusste nicht, dass ich keinen Join für einen Benutzertypen erstellen kann. Und die anderen Punkte waren mir auch nicht bewusst!
Danke!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige