Microsoft Excel

Herbers Excel/VBA-Archiv

Array an Function übergeben

Betrifft: Array an Function übergeben von: bastian
Geschrieben am: 13.09.2004 19:18:31

Hallo liebe Excelexperten,

ich hänge hier mal wieder mit einem Arrayproblem fest. Ich möchte an eine Funktion ein (String-) Array übergeben, diese Funktion verarbeitet das übergebene Array und gibt ein anderes zurück. Wie kann ich der Funktion klarmachen, daß sie ein Array zurückgeben soll ?

Bisher habe ich folgendes:

Im Sub: efsArray = getEfsOfOccurrence(searchTermArray)
(-> hier kommt schon der erste Fehler: "Argumenttyp ByRef unverträglich")

In der Funktion:

Function getEfsOfOccurrence(searchTermArray As String) As String
...
verarbeite
...
getEfsOfOccurrence = processedArray
End Function


Weiteres Problem ist, daß ich vorher nicht weiss, wie gross das efsArray sein wird, das kann verschieden sein.

Hat jemand einen Tip für mich ?

Vielen Dank & Gruss,

Bastian
  


Betrifft: AW: Array an Function übergeben von: Nepumuk
Geschrieben am: 13.09.2004 20:24:09

Hallo Bastian,
mal ein Beispielcode. Der macht zwar keinen Sinn, aber du siehst, wie es funktioniert.


Public Sub test()
    Dim strarray(1 To 5) As String, var_neuarray As Variant
    var_neuarray = testfunktion(strarray())
End Sub

Private Function testfunktion(strarray() As StringAs Variant
    Dim lngindex As Long, return_array() As String
    For lngindex = LBound(strarray) To UBound(strarray)
        ReDim Preserve return_array(1 To lngindex)
        return_array(lngindex) = CStr(lngindex)
    Next
    testfunktion = return_array
End Function


Gruß
Nepumuk


  


Betrifft: OFFTOPIC @ Nepumuk von: Boris
Geschrieben am: 13.09.2004 23:23:29

Hi Großmeister aller VBComponents,

...du hattet mir mal nen Link (oder sogar das Proramm selbst?) gepostet, mit dem du dir alle Anwendungen anzeigen lässt, die im Hintergrund auf dem PC so ihr (Un)wesen treiben - und man konnte bequem wählen, was man denn gerne haben möchte und was nicht.

Hab den Link (das Programm?) aber leider irgendwie "verbummelt" - kannst du mir das nochmals kurz posten?

Besten Dank und Grüße

{Boris}


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Rupert
Geschrieben am: 14.09.2004 08:19:17

Hi,

dafür gibts in Windows den Taskmanager.

mfg Rupert


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Nepumuk
Geschrieben am: 14.09.2004 16:01:03

Hallo Boris,
damit bekommst du alle offenen Anwendungen:


Option Explicit

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As LongByVal wCmd As LongAs Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongByVal wIndx As LongAs Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As LongAs Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongByVal lpString As StringByVal cch As LongAs Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As StringByVal lpWindowName As StringAs Long

Private Enum Constant
    GW_HWNDFIRST = 0
    GW_HWNDNEXT = 2
    GWL_STYLE = -16
    WS_VISIBLE = &H10000000
    WS_BORDER = &H800000
End Enum

Public Sub GetWindowList()
    Dim hwnd As Long, sTitle As String, lStyle As Long, lngZeile As Long
    hwnd = GetWindow(FindWindow(vbNullString, vbNullString), GW_HWNDFIRST)
    Do
        lStyle = GetWindowLong(hwnd, GWL_STYLE) And (WS_VISIBLE Or WS_BORDER)
        sTitle = GetWindowTitle(hwnd)
        If (lStyle = (WS_VISIBLE Or WS_BORDER)) = True And Trim$(sTitle) <> "" Then
            lngZeile = lngZeile + 1
            Cells(lngZeile, 1) = sTitle & " " & hwnd
        End If
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop Until hwnd = 0
End Sub

Private Function GetWindowTitle(ByVal hwnd As LongAs String
    Dim lResult As Long, sTemp As String
    lResult = GetWindowTextLength(hwnd) + 1
    sTemp = Space(lResult)
    lResult = GetWindowText(hwnd, sTemp, lResult)
    GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function


Und damit alle laufenden Prozesse:


Option Explicit

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" (ByVal dwFlags As LongByVal th32ProcessID As LongAs Long
Private Declare Function Process32First Lib "kernel32.dll" (ByVal hSnapshot As LongByRef lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32.dll" (ByVal hSnapshot As LongByRef lppe As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As LongAs Long

Private Enum Costant
    TH32CS_SNAPPROCESS = &H2
    MAX_PATH = 260
End Enum

Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * MAX_PATH
End Type

Public Sub Alle_Prozesse()
    Dim Snap As Long, Process As PROCESSENTRY32, Result As Long
    Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    If Snap <> -1 Then
        Process.dwSize = Len(Process)
        Result = Process32First(Snap, Process)
        Do Until Result = 0
            Debug.Print Process.szExeFile
            Result = Process32Next(Snap, Process)
        Loop
    End If
    CloseHandle Snap
End Sub


Gruß
Nepumuk


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Rupert
Geschrieben am: 14.09.2004 17:16:18

"und man konnte bequem wählen, was man denn gerne haben möchte und was nicht."

...und das wird mit deinem Code abgedeckt?

mfg Rupert


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Nepumuk
Geschrieben am: 14.09.2004 18:15:38

Hallo Rupert,
dann verrate mir mal, wie du dem Taskmanager dazu bringst, dass, wenn z.B. ein ICQ-Fenster aufpopt, er ein akustisches Signal erzeugt, welches mich aus der Küche an den Computer lockt.
Gruß
Nepumuk


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Rupert
Geschrieben am: 14.09.2004 18:41:41

Hi,

was hat das denn jetzt mit meiner Rückfrage zu tun? Davon war bisher noch keine Rede.
Obwohl das mit WMI natürlich kein Problem ist.

mfg Rupert


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Nepumuk
Geschrieben am: 14.09.2004 19:31:08

Hallo Rupert,
ein konkretes Beispiel, wozu ich das nutze?
Ich habe eine ziemlich große Anwendung in VB geschrieben. Um die einzelnen Programme zu starten kann der User ein kleines Formular mit Buttons aufrufen. Da die Programme auf einem Server liegen und das Netz meistens ziemlich ausgelastet ist, kann es ein paar Sekunden dauern, bis das Programm geladen ist und das erste Formular erscheint. Da die meisten User nach 0,5 Sekunden schon ungeduldig werden klicken sie immer wieder auf den Button und starten so das Programm mehrfach. Um das zu verhindern, wird der Button nach dem ersten Klick disabled. Dann sucht ein Makro nach dem Formular und erst, wenn es auf dem Bildschirm erscheint, wird der Button wieder enabled.
Gruß
Nepumuk


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Boris
Geschrieben am: 15.09.2004 08:16:33

Hi Nepumuk,

immer diese 3-Zeiler ;-)
Funktionieren naturgemäß perfekt - vielen Dank dafür.

Allerdings hast du mir letztens - so glaube ich zumindest - irgendeine .exe verlinkt/hochgeladen, mit der man die Registry-Einträge direkt beeinflussen kann - nach dem Motto: Will ich künftig nicht mehr haben - klick und weg damit.

Oder irre ich mich da ?!?

Heißen Dank!

Grüße Boris


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Nepumuk
Geschrieben am: 15.09.2004 16:28:43

Hallo Boris,
jetzt weiß ich was du meinst. Bitteschön: https://www.herber.de/bbs/user/10914.zip
Gruß
Nepumuk
P.S. Zusatzzeile, damit's kein Dreizeiler wird.


  


Betrifft: Perfekt!!! von: Boris
Geschrieben am: 15.09.2004 23:44:41

Hi Nepumuk,

genau das Teil hab ich gemeint - besten Dank!

Grüße Boris


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Harald E
Geschrieben am: 15.09.2004 08:24:33

Hallo Nepumuk,

ich hab mir erlaubt, diese Codes ebenfalls abzugreifen.
Bei Boris klappt's offensichtlich...ich bekomme ne Fehlermeldung in der ersten Codezeile für die offenen Anwendungen.
Nach End Sub, etc dürfen nur Kommentare stehen.

Ich hab's 1:1 in ein neues Modul einer leeren Arbeitsmappe kopiert.
Richtig so, oder Anfängerfehler ?

Gruß
Harald


  


Betrifft: AW: OFFTOPIC @ Nepumuk von: Nepumuk
Geschrieben am: 15.09.2004 15:59:28

Hallo Harald,
das sind zwei Programme. Kopiere sie in jeweils ein eigenes Modul.
Gruß
Nepumuk


  


Betrifft: AW: Array an Function übergeben von: bastian
Geschrieben am: 14.09.2004 20:16:46

Hi Nepomuk,

das hat geklappt vielen Dank !

Gruss B.