Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Komplexere Suchfunktion in Excel

Frage Entwicklung VB for Applications

Mitglied: bulwai

bulwai (Level 1) - Jetzt verbinden

23.09.2008, aktualisiert 24.09.2008, 3990 Aufrufe, 8 Kommentare

Hallo Zusammen!

Also,...

Bei mir ist es ähnlich wie bei anderen...
Ich habe 10 Tabellen ca. und in 9 davon sind Artikelnummern + Info etc...
Auf dem ersten Tabellenblatt möchte ich eine Suchefunktion ein baun...
Hab bis jetzt es soweit hin bekommen das ich in der ersten Spalte die Artikelnummer angebe und dieser Artikel dann in den nachfolgenden Tabellen herausgesucht wird...

Aber,... die Suchfunktion spinnt noch bissal...
Die Funktion funktioniert nicht wenn ich nur einen Artikel eingebe...
Bei mehr als einem geht es,....

Der Code wo der fehler liegen muss sieht so aus:

Sub Suchen_Item2()

Dim Suche3, letzte, Suche As Variant
Dim Suche2 As Variant
Dim i, Row, j As Integer
Dim a, s1, s2, s3 As String
Dim b As String
Dim c As String
Dim d As String
Dim wks As Worksheet
Dim e As String
Row = 5

Sheets("Tabelle1").Activate

Range("A2").End(xlDown).Offset(1, 0).Select
letzte = ActiveCell.Row - 1

For i = 1 To letzte
Suche = Suche & Cells(i, 1).Value & " "

Next

Range("B6:G65536").Value = ""

Suche2 = Split(Suche)



nachfolgend kommen nur die Such der Tabellenblätter!

Ich hoffe ihr versteht ungefair was ich meine

Mit freundlichen Grüßen und danke im vorraus
Thomas
Mitglied: bastla
23.09.2008 um 10:07 Uhr
Hallo bulwai und willkommen im Forum!

In welcher Zeile steht denn Dein erster Suchbegriff? Einerseits suchst Du danach erst ab Zeile 2 (Range("A2")), andereseits beginnst Du mit dem Auslesen ("For"-Schleife) in der Zeile 1 ...

Bedingt dadurch, dass Du auch an den letzten Suchbegriff noch ein Leerzeichen anhängst, bekommst Du außerdem in Suche2 ein Element zuviel - das lässt sich durch
01.
Suche2=Split(Trim(Suche))
vermeiden.

Soferne es keinen besonderen Grund dafür gibt (den Rest Deines Codes kenne ich ja nicht), zuerst die Zelle unterhalb des letzten Suchbegriffes auszuwählen, und dann die Zeile oberhalb zu ermitteln, sollte (falls die Suchbegriffe tatsächlich erst ab A2 eingetragen sind) die folgende Version genügen:
01.
letzte = Range("A1").End(xlDown).Row 
02.
 
03.
For i = 2 To letzte 
04.
    Suche = Suche & Cells(i, 1).Value & " " 
05.
Next 
06.
 
07.
Suche2 = Split(Trim(Suche)) 
08.
MsgBox CStr(Ubound(Suche2) + 1) & " Suchbegriff(e) gefunden." 'nur als Demo 
09.
 
10.
Range("B6:G65536").Value = ""
Grüße
bastla
Bitte warten ..
Mitglied: bulwai
23.09.2008 um 10:42 Uhr
Danke für die Antwort.
Bloß.. die Suchergebnisse sollen dann in die rechts danebenbefindende Spalte eingetragen werden
Bitte warten ..
Mitglied: bastla
23.09.2008 um 12:48 Uhr
Hallo bulwai!

Vielleicht holst Du in Deiner Beschreibung ein wenig weiter aus - derzeit kann ich den Zusammenhang zwischen dem eingangs beschriebenen (und inzwischen hoffentlich gelösten) Problem und der nebenan liegenden Spalte nicht erkennen ...

Grüße
bastla
Bitte warten ..
Mitglied: bulwai
23.09.2008 um 13:08 Uhr
http://images.lokalisten.de/photos/a/2008/09/23/13/00/464001_1222167954 ...

ich hoffe das ihr lokalisten habt und das bild sieht... ich bin bissi ungeschickt mit dem upload zeugs...
naja wenn ihr es hoffentlich seht dann seht ihr "LINKS(sorry) die sucheingaben(also die artikelnummer)
dann auf den button...
danach "sollten" alle tabellen durchsucht werden und in die spalte mit unter dem button eingetragen werden...
Bitte warten ..
Mitglied: bastla
23.09.2008 um 14:54 Uhr
Hallo bulwai!

Anhand des Screenshots lässt sich zwar grundsätzlich erkennen, welches Ziel du anstrebst, aber damit ist noch immer nicht klar, auf welchem Stand sich Dein Script derzeit befindet, und natürlich noch weniger, welcher Teil des Scripts nicht (wunschgemäß) funktioniert ...

Grüße
bastla
Bitte warten ..
Mitglied: bulwai
23.09.2008 um 14:59 Uhr
Also der komplette Code sieht so aus...
und in diesem Code ist ein fehler das er bei einer Suche nach nur einem Artikel
einfach einen fehler bringt....
das möchte natürlich nicht =P
bin echt dankbar das hier so schnell antworten kommen danke schön

Sub Suchen_Item2()

Dim Suche3, letzte, Suche As Variant
Dim Suche2 As Variant
Dim i, Row, j As Integer
Dim a, s1, s2, s3 As String
Dim b As String
Dim c As String
Dim d As String
Dim wks As Worksheet
Dim e As String
Row = 5

Sheets("Tabelle1").Activate

letzte = Range("A2").End(xlDown).Row

For i = 2 To letzte
Suche = Suche & Cells(i, 1).Value & " "
Next

Suche2 = Split(Trim(Suche))

MsgBox CStr(UBound(Suche2) + 1) & " Suchbegriff(e) gefunden." 'nur als Demo

Range("B6:G65536").Value = ""
Suche2 = Split(Trim(Suche))

arrcount = letzte
'CSC - Infrastr. Management
Sheets("CSC - Infrastr. Management").Activate
For j = 1 To arrcount
Sheets("CSC - Infrastr. Management").Activate




For i = 1 To 100

If Cells(i, 12) = Suche2(j - 1) Then

ServiceName = Cells(i, 4).Value
ItemNR = Cells(i, 10).Value
MaterialNR = Cells(i, 12).Value
Delivery = Cells(i, 13).Value
Hardware = Cells(i, 14).Value
InformationX = Cells(i, 15).Value

End If



Next i
If Suche2(j - 1) = MaterialNR Then
Row = Row + 1
Sheets("Tabelle1").Activate
Cells(Row, 2).Value = MaterialNR
Cells(Row, 3).Value = ItemNR
Cells(Row, 4).Value = ServiceName
Cells(Row, 5).Value = Delivery
Cells(Row, 6).Value = Hardware
Cells(Row, 7).Value = InformationX
End If

MaterialNR = ""
Next j

'CSC - Service Support
Sheets("CSC - Service Support").Activate
For j = 1 To arrcount
Sheets("CSC - Service Support").Activate

For i = 1 To 100

If Cells(i, 12) = Suche2(j - 1) Then

ServiceName = Cells(i, 4).Value
ItemNR = Cells(i, 10).Value
MaterialNR = Cells(i, 12).Value
Delivery = Cells(i, 13).Value
Hardware = Cells(i, 14).Value
InformationX = Cells(i, 15).Value

End If

Next i
If Suche2(j - 1) = MaterialNR Then
Row = Row + 1
Sheets("Tabelle1").Activate
Cells(Row, 2).Value = MaterialNR
Cells(Row, 3).Value = ItemNR
Cells(Row, 4).Value = ServiceName
Cells(Row, 5).Value = Delivery
Cells(Row, 6).Value = Hardware
Cells(Row, 7).Value = InformationX

End If

MaterialNR = ""
Next j

'CSC - Service Delivery
Sheets("CSC - Service Delivery").Activate
For j = 1 To arrcount
Sheets("CSC - Service Delivery").Activate

For i = 1 To 100

If Cells(i, 12) = Suche2(j - 1) Then

ServiceName = Cells(i, 4).Value
ItemNR = Cells(i, 10).Value
MaterialNR = Cells(i, 12).Value
Delivery = Cells(i, 13).Value
Hardware = Cells(i, 14).Value
InformationX = Cells(i, 15).Value

End If

Next i
If Suche2(j - 1) = MaterialNR Then
Row = Row + 1
Sheets("Tabelle1").Activate
Cells(Row, 2).Value = MaterialNR
Cells(Row, 3).Value = ItemNR
Cells(Row, 4).Value = ServiceName
Cells(Row, 5).Value = Delivery
Cells(Row, 6).Value = Hardware
Cells(Row, 7).Value = InformationX

End If

MaterialNR = ""
Next j

'Service Packages PLUS
Sheets("Service Packages PLUS").Activate
For j = 1 To arrcount
Sheets("Service Packages PLUS").Activate

For i = 1 To 100

If Cells(i, 12) = Suche2(j - 1) Then

ServiceName = Cells(i, 4).Value
ItemNR = Cells(i, 10).Value
MaterialNR = Cells(i, 12).Value
Delivery = Cells(i, 13).Value
Hardware = Cells(i, 14).Value
InformationX = Cells(i, 15).Value

End If

Next i
If Suche2(j - 1) = MaterialNR Then
Row = Row + 1
Sheets("Tabelle1").Activate
Cells(Row, 2).Value = MaterialNR
Cells(Row, 3).Value = ItemNR
Cells(Row, 4).Value = ServiceName
Cells(Row, 5).Value = Delivery
Cells(Row, 6).Value = Hardware
Cells(Row, 7).Value = InformationX

End If

MaterialNR = ""
Next j


'Service Care Packages
Sheets("Service Care Packages").Activate
For j = 1 To arrcount
Sheets("Service Care Packages").Activate

For i = 1 To 100

If Cells(i, 11) = Suche2(j - 1) Then

ServiceName = Cells(i, 4).Value
ItemNR = Cells(i, 10).Value
MaterialNR = Cells(i, 11).Value
Delivery = Cells(i, 12).Value
Hardware = Cells(i, 13).Value
InformationX = Cells(i, 14).Value

End If

Next i
If Suche2(j - 1) = MaterialNR Then
Row = Row + 1
Sheets("Tabelle1").Activate
Cells(Row, 2).Value = MaterialNR
Cells(Row, 3).Value = ItemNR
Cells(Row, 4).Value = ServiceName
Cells(Row, 5).Value = Delivery
Cells(Row, 6).Value = Hardware
Cells(Row, 7).Value = InformationX

End If

MaterialNR = ""
Next j


Sheets("Tabelle1").Activate
Range("A2:A809").Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("B6:G485").Select
Selection.Sort Key1:=Range("B6"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("A2:A468").Select
Application.CutCopyMode = False
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Selection.Cut
ActiveSheet.Paste
Selection.Cut
Range("A6").Select
ActiveSheet.Paste
Range("B6:G443").Select
Selection.Sort Key1:=Range("B6"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("A43").Select
End Sub
Bitte warten ..
Mitglied: bastla
23.09.2008 um 17:58 Uhr
Hallo bulwai!

Den Suchteil habe ich (ua durch das Auslagern des Eintragens in ein eigenes Unterprogramm) ein wenig gestrafft, und wenn die Tabellenstruktur (hinsichtlich der verwendeten Spalten) durchgängig gleich ausgelegt wäre, ließe sich das Ganze noch etwas knapper fassen ...
01.
Sub Suchen_Item2() 
02.
Row = 5 
03.
Sheets("Tabelle1").Activate 
04.
letzte = Range("A1").End(xlDown).Row 
05.
For i = 2 To letzte 
06.
    Suche = Suche & Cells(i, 1).Value & " " 
07.
Next 
08.
 
09.
Suche2 = Split(Trim(Suche)) 
10.
Range("B6:G65536").Value = "" 
11.
 
12.
arrcount = UBound(Suche2) 
13.
'CSC - Infrastr. Management #################################################################### 
14.
For j = 0 To arrcount 
15.
    With Sheets("CSC - Infrastr. Management") 
16.
        For i = 1 To 100 
17.
            If .Cells(i, 12) = Suche2(j) Then 
18.
                ServiceName = .Cells(i, 4).Value 
19.
                ItemNR = .Cells(i, 10).Value 
20.
                MaterialNR = .Cells(i, 12).Value 
21.
                Delivery = .Cells(i, 13).Value 
22.
                Hardware = .Cells(i, 14).Value 
23.
                InformationX = .Cells(i, 15).Value 
24.
                Row = Row + 1 
25.
                Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX) 
26.
                Exit For 
27.
            End If 
28.
        Next i 
29.
    End With 
30.
Next j 
31.
'CSC - Service Support ######################################################################### 
32.
For j = 0 To arrcount 
33.
    With Sheets("CSC - Service Support") 
34.
        For i = 1 To 100 
35.
            If .Cells(i, 12) = Suche2(j) Then 
36.
                ServiceName = .Cells(i, 4).Value 
37.
                ItemNR = .Cells(i, 10).Value 
38.
                MaterialNR = .Cells(i, 12).Value 
39.
                Delivery = .Cells(i, 13).Value 
40.
                Hardware = .Cells(i, 14).Value 
41.
                InformationX = .Cells(i, 15).Value 
42.
                Row = Row + 1 
43.
                Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX) 
44.
                Exit For 
45.
            End If 
46.
        Next i 
47.
    End With 
48.
Next j 
49.
'CSC - Service Delivery ######################################################################### 
50.
For j = 0 To arrcount 
51.
    With Sheets("CSC - Service Delivery") 
52.
        For i = 1 To 100 
53.
            If .Cells(i, 12) = Suche2(j) Then 
54.
                ServiceName = .Cells(i, 4).Value 
55.
                ItemNR = .Cells(i, 10).Value 
56.
                MaterialNR = .Cells(i, 12).Value 
57.
                Delivery = .Cells(i, 13).Value 
58.
                Hardware = .Cells(i, 14).Value 
59.
                InformationX = .Cells(i, 15).Value 
60.
                Row = Row + 1 
61.
                Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX) 
62.
                Exit For 
63.
            End If 
64.
        Next i 
65.
    End With 
66.
Next j 
67.
'Service Packages PLUS ######################################################################### 
68.
For j = 0 To arrcount 
69.
    With Sheets("Service Packages PLUS") 
70.
        For i = 1 To 100 
71.
            If .Cells(i, 12) = Suche2(j) Then 
72.
                ServiceName = .Cells(i, 4).Value 
73.
                ItemNR = .Cells(i, 10).Value 
74.
                MaterialNR = .Cells(i, 12).Value 
75.
                Delivery = .Cells(i, 13).Value 
76.
                Hardware = .Cells(i, 14).Value 
77.
                InformationX = .Cells(i, 15).Value 
78.
                Row = Row + 1 
79.
                Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX) 
80.
                Exit For 
81.
            End If 
82.
        Next i 
83.
    End With 
84.
Next j 
85.
'Service Care Packages ######################################################################### 
86.
For j = 0 To arrcount 
87.
    With Sheets("Service Care Packages") 
88.
        For i = 1 To 100 
89.
            If .Cells(i, 11) = Suche2(j) Then 
90.
                ServiceName = .Cells(i, 4).Value 
91.
                ItemNR = .Cells(i, 10).Value 
92.
                MaterialNR = .Cells(i, 11).Value 
93.
                Delivery = .Cells(i, 12).Value 
94.
                Hardware = .Cells(i, 13).Value 
95.
                InformationX = .Cells(i, 14).Value 
96.
                Row = Row + 1 
97.
                Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX) 
98.
                Exit For 
99.
            End If 
100.
        Next i 
101.
    End With 
102.
Next j 
103.
 
104.
'Sortierung etc 
105.
 
106.
End Sub 
107.
 
108.
Sub Eintragen(R, C, Values) 
109.
    For i = 0 To UBound(Values) 
110.
        Cells(R, C + i).Value = Values(i) 
111.
    Next 
112.
End Sub
Das Sortieren / Umkopieren im Anschluss an das Suchen und Übertragen der Daten sieht nach aufgezeichnetem Makro aus - wenn Du die Aufzeichnung (mit auf das wirklich Nötige beschränkten Arbeitsschritten) nochmals durchführst, solltest Du auch diesen Teil noch optimieren können.
Noch als Anmerkung zu den weiteren Änderungen: Das zwischenzeitliche Aktivieren der übrigen Tabellen lässt sich durch Angabe des Blattes (vereinfacht durch "With"-Blöcke) vermeiden, und unter der Annahme, dass jeder Suchbegriff nur einmal in den einzelnen Tabellen steht, sorgt das vorzeitige Verlassen der "For i"-Schleife mit "Exit For" für etwas Performance-Gewinn.

Eine alternative Schreibweise (ohne Verwendung eines Unterprogrammes) könnte (am Beispiel Suche in der ersten Tabelle) so aussehen:
01.
For j = 0 To arrcount 
02.
    With Sheets("CSC - Infrastr. Management") 
03.
        For i = 1 To 100 
04.
            If .Cells(i, 12) = Suche2(j) Then 
05.
                Row = Row + 1 
06.
                Values = Array( _ 
07.
                    .Cells(i, 10).Value, _ 
08.
                    .Cells(i, 12).Value, _ 
09.
                    .Cells(i, 4).Value, _ 
10.
                    .Cells(i, 13).Value, _ 
11.
                    .Cells(i, 14).Value, _ 
12.
                    .Cells(i, 15).Value _ 
13.
14.
                Sheets("Tabelle1").Cells(Row, 2).Resize(1, UBound(Values) + 1) = Values 
15.
                Exit For 
16.
            End If         
17.
        Next i 
18.
    End With 
19.
Next j
Noch kürzer (da ja die Anzahl der zu übertragenden Zellen = 6) bekannt ist (aber etwas weniger übersichtlich ):
01.
For j = 0 To arrcount 
02.
    With Sheets("CSC - Infrastr. Management") 
03.
        For i = 1 To 100 
04.
            If .Cells(i, 12) = Suche2(j) Then 
05.
                Row = Row + 1 
06.
                Sheets("Tabelle1").Cells(Row, 2).Resize(1, 6) = _ 
07.
                    Array(.Cells(i, 10), .Cells(i, 12), .Cells(i, 4), .Cells(i, 13), .Cells(i, 14), .Cells(i, 15)) 
08.
                Exit For 
09.
            End If 
10.
        Next i 
11.
    End With 
12.
Next j
Zum Thema Variablendeklaration: Grundsätzlich ist es natürlich zu empfehlen, alle Variablen zu deklarieren und dann mit "Option Explicit" für mehr Sicherheit zu sorgen, allerdings sollte dann auch hinsichtlich der Typen bzw der tatsächlich verwendeten Variablen konsequent vorgegangen werden - so erzeugt etwa die Zeile
01.
Dim i, Row, j As Integer
die Variablen "i" und "Row" als Variant, und nur "j" wird ein Integer - in VBA muss der Datentyp (anders als etwa in .NET) für jede einzelne Variable festgelegt werden, also
01.
Dim i As Integer, Row As Integer, j As Integer
Du könntest die entsprechenden "Dim"-Statements für den obigen Code noch nachtragen (womit Du diesen Code dann auch gleich besser kennen lernst ).

Grüße
bastla
Bitte warten ..
Mitglied: bulwai
24.09.2008 um 07:42 Uhr
Sau Geil.
Mercie dir... das funktioniert ja wunderbar =)
ich werde mich weiterdran noch damit beschäftigen und üben =P
danke dir nochmal..
ich hoffe das wenn ich weitere fragen habe, du mir da auch noch behilflich sein kannst XD
danke dir

Mit freundlichen Grüßen bulwai /thomas
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
VB for Applications
Excel VBA Sortierung von Daten (5)

Frage von easy4breezy zum Thema VB for Applications ...

Microsoft Office
gelöst Excel-Formel oder VBA (7)

Frage von nicki01 zum Thema Microsoft Office ...

Microsoft Office
Prüfung von Intervallen und Textausgabe in Excel (2)

Frage von traller zum Thema Microsoft Office ...

Microsoft Office
Darstellung einer Produktionsmenge in einer Excel Übersicht! (4)

Frage von Magnus32x1 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...