Tag: excel
excel kennwort entfernen
irgendwo im netz gefunden. immer wieder gebraucht. hier nochmal festgehalten.
blattschutz entfernen:
– vb editor oeffnen (alt+f11)
– neues modul in die arbeitsmappe einfuegen
dann diesen code einfuegen:
Sub SchutzEntfernen()
On Error Resume Next
For i = 65 To 66: For j = 65 To 66
For k = 65 To 66: For l = 65 To 66
For m = 65 To 66: For n = 65 To 66
For o = 65 To 66: For p = 65 To 66
For q = 65 To 66: For r = 65 To 66
For s = 65 To 66: For t = 32 To 126
ActiveSheet.Unprotect Chr(i) & _
Chr(j) & Chr(k) & Chr(l) & _
Chr(m) & Chr(n) & Chr(o) & _
Chr(p) & Chr(q) & Chr(r) & _
Chr(s) & Chr(t)
Next t: Next s: Next r: Next q
Next p: Next o: Next n: Next m
Next l: Next k: Next j: Next i
MsgBox "Schutz abgeschaltet"
End Sub
– vb editor schliessen
– mit alt+f8 modul auswaehlen und ausfuehren.
aehnlich geht das mit dem kennwort auf die komplette arbeitsmappe… gleiches vorgehen, nur statt “ActiveSheet.Unprotect” ein:
ActiveWorkbook.Unprotect Chr(i) & _
vba: download files (website requires login)
notiz… damit ich das nicht nochmal erfinden muss. die webseite erfordert ein login, bevor man daten runterladen kann. das login formular muss man sich halt mal ansehen und die entsprechenden werte in einem POST request schicken. ich habe dazu einfach irgendein firefox plugin beim login mitlaufen lassen, welches den entsprechenden POST request aufzeichnet. das cookie muss man dann noch aus der antwort des webserver axtrahieren und beim anschliessenden download der dateien mitschicken.
mit excel 2003 und dem ie7 ging das noch ohne login in vba, wenn man sich vorher im browser eingeloggt hatte (mit urlmon o.ä. einfach runterladen). mit excel 2010 und ie9 muss man sich explizit (mit vba) einloggen um die dateien runterladen zu können.
Option Explicit
Sub DownloadData()
Dim strSavePath As String
Dim strURL As String
Dim strURLDownload As String
Dim strHeaders As String
Dim strResult As String
Dim strRequest As Variant
Dim objXMLhttp: Set objXMLhttp = CreateObject("msxml2.xmlhttp")
Dim strUsername As String
Dim strPassword As String
Dim strFileToSave As String
Dim xArr As Variant
Dim yArr As Variant
Dim strTheCookie As String
Dim strCookie As String
Dim objStream: Set objStream = CreateObject("ADODB.Stream")
Dim i
Dim WkSh As Worksheet ' das Quell-Tabellenblatt - die Herkunft der Daten
Dim lZeile As Long
' Variablen
Set WkSh = ThisWorkbook.Worksheets("DOWNLOADFILES") ' den Tabellenblattnamen ggf. anpassen!
' Format in dem Tabellenblatt DOWNLOADFILES.. einfach eine Auflistung der Download URLs:
'http://www.website.com/download/data/file_1.xls
'http://www.website.com/download/data/file_2.xls
'http://www.website.com/download/data/file_3.xls
' Pfad zum speichern der XLS Dateien
strSavePath = "c:\temp\"
strUsername = "vorname.nachname%40domain.tld" ' URL encoded: @ = %40
strPassword = "mypassword"
' Login URL
strURL = "http://www.website.com/login-user"
' mitgehörter request header (mit Firefox Plugin aufgezeichnet)
' Benutzername und Passwort durch Variablen ersetzt
strRequest = "viewFrom=viewLOGIN&forward=%2Fbackend%2Findex.html&referer=%2Flogin.html&username= " & strUsername & "&password=" & strPassword & "&actionSUBMIT.x=0&actionSUBMIT.y=0"
' Login
With objXMLhttp
.Open "POST", strURL, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send strRequest
End With
strHeaders = objXMLhttp.getAllResponseHeaders()
' ggf Response speichern um das Cookie anzuschauen
'Open "C:\temp\response.txt" For Output As #1
' Print #1, , strHeaders
'Close
' Beispiel Cookie aus strHeaders
'Set-Cookie: BALANCERID=b.cocoon0a0815; Expires=Tue, 07-Aug-2012 08:00:00 GMT; Path=/
' Cookie extrahieren
xArr = Split(strHeaders, "Set-Cookie: ")
For i = 1 To UBound(xArr)
strTheCookie = Left(xArr(i), InStr(xArr(i), "Path=/") - 2)
strCookie = strCookie & " " & strTheCookie
Next
yArr = Split(strCookie, ";")
strCookie = yArr(0)
For lZeile = 1 To WkSh.Cells(Rows.Count, 1).End(xlUp).Row
' Downloadlink
strURLDownload = WkSh.Range("A" & lZeile).Value
' Dateiname aus URL extrahieren
strFileToSave = Mid$(strURLDownload, InStrRev(strURLDownload, "/") + 1)
' Download der xls Datei
With objXMLhttp
.Open "GET", strURLDownload, False
.setRequestHeader "cache-control", "no-cache, must revalidate"
'Cookie 2mal setzen... Bug: http://support.microsoft.com/kb/290899
.setRequestHeader "Cookie", strCookie
.setRequestHeader "Cookie", strCookie
.send
End With
' Speichern der xls Datei als Binary
With objStream
.Type = 1 ' adTypeBinary
.Open
.Write objXMLhttp.responseBody
.SaveToFile strSavePath & strFileToSave, 2 ' adSaveCreateOverWrite
End With
objStream.Close
Next lZeile
Set objStream = Nothing
Set objXMLhttp = Nothing
End Sub
excel: kalender mit bedingten formatierungen (in vba)
vor langer zeit hab ich schonmal einmal einen kalender mit bedingten formatierungen in excel gebastelt. jetzt habe ich das mal mit vba gemacht… that’s it (eine von 100000 moeglichkeiten in quick & dirty):
Option Explicit
Sub Kalender()
'Variablen deklarieren
Dim MyStartDate As Date
Dim MyEndDate As Date
Dim MyTempDate As Date
Dim OffsetX As Integer
Dim OffsetY As Integer
Dim BGWE As Integer
Dim BGKW1 As Integer
Dim BGKW2 As Integer
Dim MyTempKW As Integer
Dim Zähler As Integer
Dim MyWorksheet As String
Dim KWBackgrund As Integer
Dim MyHeadLine As Variant
Dim i As Integer
'Start- und Endedatum setzen; möglich mit verschiedenen Schreibweisen
MyStartDate = "01. Mai 2012"
MyEndDate = "31.01.2014"
'Tabellenblatt für den Kalender
MyWorksheet = "Tabelle1"
'in welcher Zeile soll der Kalender beginnen?
OffsetY = 1
'in welcher Spalte soll der Kalender beginnen?
OffsetX = 1
'Hintergrundfarbe für Wochenende
BGWE = 15
'Hintergrundfarbe für KW im Wechsel
BGKW1 = 0
BGKW2 = 16
'Überschriften
MyHeadLine = Array("Datum", "Tag", "KW")
'Inhalt aller Zeilen löschen
Rows("1:65536").ClearContents
'Alle Formatierungen löschen
Cells.ClearFormats
'Überschriften
For i = 0 To UBound(MyHeadLine)
Worksheets(MyWorksheet).Cells(OffsetY, OffsetX + i).Value = MyHeadLine(i)
Worksheets(MyWorksheet).Cells(OffsetY, OffsetX + i).Font.FontStyle = "Fett"
Next
'Kalender ausgeben
For Zähler = 0 To DateDiff("d", MyStartDate, MyEndDate)
MyTempDate = DateAdd("d", Zähler, MyStartDate)
'Wochenende grau Markieren
If Format(MyTempDate, "DDD") = "Sa" Or Format(MyTempDate, "DDD") = "So" Then
Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX + 1).Interior.ColorIndex = BGWE
End If
'Farbwechsel für die KW
KWBackgrund = IIf(kw_nach_din(MyTempDate) And 1, BGKW1, BGKW2)
Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX + 2).Interior.ColorIndex = KWBackgrund
'aktuellen Tag rot Markieren
If MyTempDate = Date Then
Worksheets(MyWorksheet).Range(Cells(1 + Zähler + OffsetY, OffsetX), Cells(1 + Zähler + OffsetY, OffsetX + 2)).Interior.Color = vbRed
End If
'erste Spalte mit Datum
Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX).Value = MyTempDate
'zweite Spalte mit Wochentag
Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX + 1).Value = Format(MyTempDate, "DDD")
'dritte Spalte mir KW (aber nur am ersten Tag der KW ausgeben)
If MyTempKW <> kw_nach_din(MyTempDate) Then
Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX + 2).Value = kw_nach_din(MyTempDate)
MyTempKW = kw_nach_din(MyTempDate)
End If
Next Zähler
End Sub
Function kw_nach_din(datum As Date) As Byte
Dim kw As Date
kw = 4 + datum - Weekday(datum, 2)
kw_nach_din = (kw - DateSerial(Year(kw), 1, -6)) \ 7
End Function
das ergebnis ist vergleichbar mit dem von damals:
excel: “Argumenttyp ByRef unverträglich”
vba und die variablendeklaration… au weia. diese fehlermeldung kommt sicher jedem mal unter, der sich etwas mit vba beschaeftigt.
so hat man das mal gelernt mit der mehrfachdeklaration von variablen:
'Variablen deklarieren
Dim MyStartDate, MyEndDate, MyTempDate, MyDate As Date
nun z.b. eine funktion, welche als uebergabeparameter ein datum erwartet. wenn man dieser funktion nun die mit einem datum befuellten variable “MyTempDate” uebergibt, bekommt man die oben abgebildete fehlermeldung. und warum?
dazu muss man wissen, dass vb alle variablen, die nicht explizit mit einem bestimmten datentyp deklariert wurden, als “variant” deklariert. das tolle deklarieren von mehreren variablen in einer zeile funktioniert naemlich garnicht! dann hat ist der typ der o.g. variable “MyTempDate” naemlich “variant”.
um dem problem aus dem weg zu gehen, sollte man einfach alle variablen einzeln deklarieren. ist mehr arbeit, braucht mehr platz… aber funktioniert.
'Variablen deklarieren
Dim MyStartDate As Date
Dim MyEndDate As Date
Dim MyTempDate As Date
Dim MyDate As Date