Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1492to1496
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

ExecuteExcel4Macro CountIf

ExecuteExcel4Macro CountIf
12.05.2016 01:47:53
DirkR
Hallo Excelgemeinde!
Ich suche einen Weg, in einer geschlossenen Arbeitsmappe zu überprüfen, ob ein Wert in einem Bereich vorkommt.
Das versuche ich nun schon eine ganze Zeit, leider ohne Erfolg. Ich habe schon einiges umgebaut und wieder umgebaut.
Letztlich endete es immer in Fehlermeldungen!
Ich bitte um Hilfe!!!
Hier mal mein letzter Ansatz zu dem beschriebenen Problem:
Function xl4CountIf(strParam As String, strFind As String) As Variant
xl4CountIf = ExecuteExcel4Macro("CountIf(" & strParam & "," & strFind & ")")
End Function
Sub CallCountIf()
Dim Adresse As String, Suchbegriff As String, Zellbezug As String
Pfad = "C:\Users\Dirk\Desktop\XL4\"
Datei = "xl4Datenbank.xlsx"
Register = "Tabelle1"
Zellbezug = Range(Cells(1, 2), Cells(100, 2)).Address(ReferenceStyle:=xlR1C1)
Adresse = "'" & Pfad & "[" & Datei & "]" & Register & "'!" & Zellbezug
Suchbegriff = 10
MsgBox "ZÄHLENWENN in " & Zellbezug & " nach " & Suchbegriff & ": " & xl4CountIf(Adresse,  _
Suchbegriff)
End Sub

Danke schon mal im Voraus!
Grüße
DirkR

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Schneller importierst/verknüpfst Du den Bereich ..
12.05.2016 07:12:45
lupo1
... in ein neues Blatt Deiner Anwendung und wendest dort CountIf an. Dann löschst Du das Blatt wieder.

AW: Schneller importierst/verknüpfst Du den Bereich ..
12.05.2016 07:28:21
Luschi
Hallo DirkR,
warum schreibst Du nicht den Link dazu, woher dieser Vba-Code stammt?
https://de.wikibooks.org/wiki/VBA_in_Excel/_XL4-Makros_in_VBA_verwenden#Programmierbeispiele
Bereits 2009 schrieb Excel-MVP Thomas Ramel dies:

Ich habe ein paar Tests gemacht und bin auf Inkonsistenzen gestossen -
teilweise habe ich ebenfalls denn 1004-Laufzeitfehler erhalten, teilweise
wurde ein Ergebnis zurück geliefert, allerdings um eine Spalte nach links
verschoben, also falsch.
Ich halte diese Zugriffe auf geschlossenen Mappen daher für nicht
'tauglich' und ergänze meine erste Aussage:
Die meisten Funktionen können nicht (zuverlässig) auf die Daten einer
'geschlossenen' Mappe angewandt werden.
http://microsoft.public.de.excel.narkive.com/FyyuJuEt/anzahl2-aus-geschlo-mappe

Deshalb würde ich mich auf solch windige Sachen nicht einlassen, schon garnicht im produktiven Bereich.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: ExecuteExcel4Macro CountIf
12.05.2016 18:10:40
DirkR
Hallo,
zunächst vielen Dank für eure Mühe.
Ich kann leider die Daten nicht in ein neues Tabellenblatt kopieren/ verknüpfen und anschließend es mit CountIf bearbeiten, weil ich mit CreateObject("Excel.Application") aus Powerpoint den Code starten muss.
Hintergrund ist folgender:
Ich habe eine Powerpoint-Präsentation. Am Anfang muss der Benutzer einen Button anklicken damit es überhaupt weitergeht mit der Präsentation.
Da soll geprüft werden, ob der Benutzer bereits in der Excelliste in Spalte A aufgeführt ist.
Ist dieser aufgeführt, so kann er am Ende der Präsentation eine "Lesebestätigung" senden.
Konkret wird dann in der Zeile des Users in der nächsten freien Spalte ein Eintrag vorgenommen. Spätestens an diesem Punkt muss ich die Arbeitsmappe kurz öffnen.
Anschließend verwische alle Spuren auf die Excel-Datei, damit keine Manipulation vorgenommen werden kann.
Diesen tiefen Eingriff möchte ich allerdings nur bei den gelisteten Benutzern vornehmen.
Daher soll die erste Prüfung nach Möglichkeit durch ein xl4Makro erfolgen.
Die Funktion CountIf im Zusammenhang mit einem xl4 Makro scheint wohl eher schlecht.
Ich habe einen neuen Ansatz gebastelt und muss diesen gleich dann noch aus der Powerpoint-Präsentation testen. Sieht aber bisher ganz gut aus.
Option Explicit
Public Const Path = "C:\Users\Dirk\Desktop\XL4"
Public Const File = "DB_User.xlsx"
Public Const wksName = "Tabelle1"
Sub xl4DB_User()
Dim Zeile As Integer, Spalte As Integer
Dim wks As String, MsgText As String
wks = "'" & Path & "\[" & File & "]" & wksName & "'!"
Spalte = 1
For Zeile = 1 To 100
If ExecuteExcel4Macro(wks & "R" & Zeile & "C" & Spalte) = LCase(Environ("Username")) Then
MsgText = "User  ''" & LCase(Environ("Username")) & "''  hat folgende Eintragungen:"
Do Until ExecuteExcel4Macro(wks & "R" & Zeile & "C" & Spalte + 1) = 0
MsgText = MsgText & vbNewLine & Format(ExecuteExcel4Macro(wks & "R" & Zeile & "C" &  _
Spalte + 1), "dd/mm/yyyy")
Spalte = Spalte + 1
Loop
Exit For
End If
Next Zeile
MsgBox IIf(Zeile = 101, "Der User ''" & LCase(Environ("Username")) & "'' ist nicht aufgelistet!" _
, MsgText)
End Sub
Gibt es aus eurer Sicht einen besseren Lösungsansatz?
Denkbar wäre auch eine Möglichkeit, die ein Öffnen der Arbeitsmappe nur durch einen bestimmten User (Ich) und durch einen Code aus der Powerpoint-Präsentation ermöglicht. Allerdings habe ich derzeit keine wirkliche Idee für die Umsetzung!
Für weitere Ideen/ Tipps wäre ich dankbar!
Grüße
DirkR

Anzeige
AW: ExecuteExcel4Macro CountIf
14.05.2016 18:08:48
Michael
Hi Dirk,
ich kann mir nicht vorstellen, wie Dein Makro funktionieren soll.
Wenn man davon ausgeht, daß die ganze Geschichte im Netz stattfindet (Du übernimmst ja den Username aus dem Environment des Rechners, der die PPP startet), wie soll dann das Makro bitte auf Dein LOKALES Laufwerk unter
Pfad = "C:\Users\Dirk\Desktop\XL4\"
zugreifen?
Du wirst nicht umhin kommen, die Datei irgendwo im LAN zu speichern - sowohl für die Abfrage als auch das Schreiben der "Lesebestätigung".
Oder habe ich da was mißverstanden?
Schöne Grüße,
Michael

Anzeige
AW: ExecuteExcel4Macro CountIf
15.05.2016 00:29:49
DirkR
Hallo Michael,
der Code ist derzeit noch in einer Testdatei local. Die PPP ist narürlich im Netzwerk und die Exceldatei auf die später zugegfiffen wird auch.
Gruß DirkR

AW: ExecuteExcel4Macro CountIf
15.05.2016 17:01:16
Michael
Hallo Dirk,
dann ist das mal klar.
Aber "Anschließend verwische alle Spuren auf die Excel-Datei" ist dann zumindest fragwürdig: wenn die Datei im Netz ist, ist sie theoretisch für jeden greifbar.
Um Luschis Zitat noch zu konkretisieren: auch ExecuteExcel4Macro muß natürlich im Hintergrund die Datei öffnen, nur daß das in dem Fall halt nicht explizit "programmiert" ist.
Was spricht dagegen, die Datei im readonly-Modus zu öffnen? Das funktioniert a) zuverlässig und b) schneller als die einzelnen Zellzugriffe, etwa so:
Option Explicit
' Public Const Path = "C:\Users\Dirk\Desktop\XL4"
Public Const Path = "C:\A_Herber"
Public Const File = "DB_User.xlsx"
Public Const wksName = "Tabelle1"
Sub xl4DB_User_ReadOnly()
Dim Zeile As Long, maxZ As Long, Spalte As Long
Dim wks As String, MsgText As String
Dim wkb As Workbook
Dim ergebnis As Variant
Spalte = 1
Set wkb = Workbooks.Open(Path & "\" & File, 0, True)
With wkb.Sheets(wksName)
maxZ = .Cells(.Rows.Count, Spalte).End(xlUp).Row
ergebnis = Application.Match(LCase(Environ("Username")), _
.Range(.Cells(1, Spalte), .Cells(maxZ, Spalte)), 0)
MsgText = "User  ''" & LCase(Environ("Username"))
If Not IsError(ergebnis) Then
MsgText = MsgText & "''  hat folgende Eintragungen:"
Do Until .Cells(ergebnis, Spalte + 1) = 0
MsgText = MsgText & vbNewLine & Format(.Cells(ergebnis, Spalte + 1), "dd/mm/yyyy")
Spalte = Spalte + 1
Loop
Else
MsgText = MsgText & "'' ist nicht aufgelistet!"
End If
End With
wkb.Close
MsgBox MsgText
End Sub
Naja, Du kannst es ja mal testen.
Schöne Grüße,
Michael
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige