Hur skriver man till en fil så att det blir raka kolumner när orden är olika långa? Hej om man vill ha tre kolumner efter varann hur kan man då skriva? Ett annat sätt att göra det på är Jag har testat det du skrev men det blev endå inte som jag ville. Jag vill att det ska bli som följande: Testa detta så skall det funka Det fungerade men.. om jag vill ha så att a(1) inte stöter ihop med b(1) vad ska jag göra då, om du har så att man bara kan ha tio tecken på a(1) så börjar nästa b(1) på 11 platsen! Hur ska jag göra om jag vill att det minst ska vara ett mellanslag mellan dem ?? Om du vill ha texten i kolumner med max ett teckens mellanrum mellan den längsta texten i en kolumn och nästa så måste du ta reda på hur många tecken den längsta texten har i varje kolumn först... Enklast är att bara lägga till ett mellanslag mellan alla. Hej. Tänkte bidra med lite konstruktiv kritik: Hej och tack!Skriva snyggt till fil
Sv: Skriva snyggt till fil
Du använder Tab funktionen
Exempel från ett av mina projekt
Printer.Print ; Tab(11); dtaBasData.Recordset(10) _
; Tab(40); dtaBasData.Recordset(0); "." _
; Tab(45); dtaBasData.Recordset(1) _
Byt ut mina dtaBasData.Recordset() mot en experiment
text sträng så förstår du tekniken.
mvh
SvenSv: Skriva snyggt till fil
det ska se ut ungefär så här:
Jag 17 år Gymnastik
Han 15 år Golf
/BultenSv: Skriva snyggt till fil
<code>
Dim psVar1 As String * 20
Dim psVar2 As String * 20
psVar1 = "Test"
psVar1 = "Test2 Test2"
Debug.Print psVar1
Debug.Print psVar2
</code>
När du skriver String * 20 så kommer den att bli 20 tecken lång vad du en fyller i den, på detta sätt kan du defenera hur allt skall se ut väldigt lätt.
//TobbeSv: Skriva snyggt till fil
Petter 25 sundsvall
Erik 24 Kalmar
Men i stället blev det:
petter 25 sundsvall
Erik 24 Kalmar
De ligger inte efter kolumner! hur ska jag göra ??
Mega tacksam för svar
/BultenSv: Skriva snyggt till fil
byt ut debug.print till rutinen du har för att skriva till fil
<code>
Dim a(1) As String * 10
Dim b(1) As String * 5
Dim c(1) As String * 15
a(0) = "Petter"
b(0) = "25"
c(0) = "sundsvall"
a(1) = "Erik"
b(1) = "24"
c(1) = "Kalmar"
Debug.Print a(0) & b(0) & c(0)
Debug.Print a(1) & b(1) & c(1)
</code>
//TobbeSv: Skriva snyggt till fil
Jag gjorde som det stod i din kod men det blev inte exat på linje, det såg ut såhär:
Petter 24 sundsvall
Erik 25 Kalmar Sv: Skriva snyggt till fil
Säg att du har all text i en 2-dimensionell array som du skickar som indata till en procedur som sedan skall formatera texten och skriva ut den till något media (immediate-fönstret i mitt exempel):
<code>
Option Explicit
Private Sub Command1_Click()
Dim arr() As String
'Lite fejk-data
ReDim arr(0 To 1, 0 To 2)
arr(0, 0) = "Petter"
arr(0, 1) = "24"
arr(0, 2) = "Sundsvall"
arr(1, 0) = "Erik"
arr(1, 1) = "25"
arr(1, 2) = "Kalmar"
'Skicka arraen för utskrift
Call PrintThis(arr)
End Sub
Private Sub PrintThis(Data As Variant)
'beräkna maxbredden per kolumn och spara i en array
Dim i As Integer
Dim j As Integer
Dim max() As Integer
ReDim max(UBound(Data, 2))
'Gå igenom varje rad i arrayen
For i = 0 To UBound(Data, 1)
'och varje kolumn
For j = 0 To UBound(Data, 2)
max(j) = IIf(max(j) < Len(Data(i, j)), Len(Data(i, j)), max(j))
Next j
Next i
'Nu kan arrayen skrivas ut
For i = 0 To UBound(Data, 1)
For j = 0 To UBound(Data, 2)
Debug.Print Data(i, j) & Space(max(j) - Len(Data(i, j)) + 1);
Next j
Debug.Print
Next i
End Sub
</code>
Hm, det såg lite krångligt ut... borde finnas enklare sätt?! :-)
// QezlotSv: Skriva snyggt till fil
Dim a As String * 10
Dim b As String * 5
Dim c As String * 15
a = "Petter"
b = "25"
c = "sundsvall"
Debug.Print a & " " & b & " " & c
a = "Erik"
b = "24"
c = "Kalmar"
Debug.Print a & " " & b & " " & c Sv: Skriva snyggt till fil
* Använd inte IIF funktionen. Den är långsam.
* När man jämför max min värden är det bäst att tilldela första värdet.
Slipper man ifsats för det samt att negativa värden inte ställer till det.
* Long är snabbare än integer på 32 bitars system som win9x och uppåt.
Det är oxå den "minsta" variabel. Mindre variabler tar onödiga resurser i anspråk vid beräkningar.
* Använd namn på variabler. Inte bokstäver som inte säger något.
* För att fylla ut en variabel kan man lägg till lika antal utfyllnads tecken före/efter och använda left/right funktionen.
* Använd funktioner som slutar på $. Detta retunerar strängar istället för variant.
* Utför beräkningar om möjligt utanför loop.
<code>
Option Explicit
Private Sub Command1_Click()
Dim arr() As String
'Lite fejk-data
ReDim arr(0 To 1, 0 To 2)
arr(0, 0) = "Petter"
arr(0, 1) = "24"
arr(0, 2) = "Sundsvall"
arr(1, 0) = "Erik"
arr(1, 1) = "25"
arr(1, 2) = "Kalmar"
'Skicka arraen för utskrift
Call PrintThis(arr)
End Sub
'beräkna maxbredden per kolumn och spara i en array
Private Sub PrintThis(Data As Variant)
Dim Row As Long
Dim Col As Long
Dim Length As Long
Dim Max() As Long
Dim Padding() As String
ReDim Max(UBound(Data, 2))
'tilldelar maxvärdena för första raden
For Col = 0 To UBound(Data, 2)
Max(Col) = Len(Data(0, Col))
Next
'Gå igenom varje rad i arrayen
For Row = 1 To UBound(Data, 1)
'och varje kolumn
For Col = 0 To UBound(Data, 2)
Length = Len(Data(Row, Col))
If Max(Col) < Length Then
Max(Col) = Length
End If
Next
Next
'Förbereder värden
ReDim Padding(0 To UBound(Data, 2))
For Col = 0 To UBound(Data, 2)
Max(Col) = Max(Col) + 1
Padding(Col) = Space$(Max(Col) + 1)
Next Col
'Nu kan arrayen skrivas ut
For Row = 0 To UBound(Data, 1)
For Col = 0 To UBound(Data, 2)
Debug.Print Left$(Data(Row, Col) & Padding(Col), Max(Col));
Next Col
Debug.Print
Next
End Sub
</code>
Annars är det ett bra exempel.
/Mvh, Andreas Hillqvist Sv: Skriva snyggt till fil
Prestandatips är alltid välkomna, måste väl erkänna att jag läst de tipsen förut fast jag inte lever som jag lär ;-)
Anledningen till Iif() var bara för att det var sent och jag kände mig lite elak. ;-)
// Qezlot