Archiv ‘IT’

Donnerstag, 26. Juli 2012

Access stellt importierte Excel-Zeilenschaltungen als Sonderzeichen dar

Microsoft-Produkte weisen seit Jahrzehnten kompromisslose Interoperabilität auf:

As you have found, Excel uses only the line feed character (ASCII 10) to indicate a line break, while Access uses carriage return + line feed (ASCII 13 and ASCII 10).

Damit die Zeilenschaltungen auch in Access als Zeilenschaltungen angezeigt werden, führt man nach dem Import einer Excel-Datei in eine Access-Tabelle folgendes Query aus:

UPDATE Feststellungen SET Feststellung = Replace(Feststellung,Chr(10),Chr(13) & Chr(10));

Via: Import Text from Excel with line breaks (2003)

Tags: , , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 18. Juli 2012

Microsoft Excel beschwert sich über „Too many different cell formats“

Es vergeht keinen Tag am Bürorechner, an welchem man nicht eine neue Fehlermeldung in Microsoft-Produkten präsentiert kriegt – und sich beim der Recherche zum Fehler wieder einmal wünschen würde, jeden einzelnen Entwickler in Redmond einen unendlich langsamen Tod sterben zu lassen.

Microsoft gibt seinen Endanwendern die grandiose Möglichkeit, jede einzelne Tabellenzeile mit einem individuellen Format zu versehen. Rahmendicke, Hintergrundfarben, Schriftschnitte können individuell definiert werden. Und jede so formatierte Zelle ergibt ein neues Zellformat, welches in der Excel-Datei zentral gesichert wird.

Das Schöne daran ist, dass es offenbar Endanwender in Schwellenländern gibt, welche es bei der Erledigung von ausgelagerten Arbeiten fertigbringen, annähernd 65’000 Formate in einer einzigen Excel-Datei mit ca. 20 Sheets unterzubringen. Heilige Shiva! Das Problem: Excel kriegt massiven Schluckauf, sobald diese Limite (wahrscheinlich mit der Grenze für unsigned integers) erreicht ist – nichts geht mehr, keine Zellformatierung, kein Zusammenführen von Zellen, ja nicht einmal kopieren geht mehr. Und dazu die lapidare Fehlermeldung:

Too many different cell formats.

Die Lösung ist im Grunde simpel: Das Dokument muss analysiert und nicht verwendete Styles gelöscht werden. Dafür gibt es mittlerweile unzählige Varianten, davon hier nur drei:

  • Kommerziell. 39 Dollar will der Entwickler des Style Reduction Tools haben, damit die Excel-Endanwender wieder arbeiten und nicht Excel-Fehlermeldungen wegglicken und Abstürze überwinden müssen.
  • Handgestrickt. Auf Stackoverflow findet sich VBA-Code, welchen man mit entsprechenden Kenntnissen über eine Excel-Datei laufen lassen kann. Fallstricke:
    • .xlsx-Dateien müssen zuerst in .xlsm-Dateien umkonvertiert werden
    • Danach muss man das Developer-Ribbon aktivieren
    • Anschliessend fügt man ein Modul in die Excel-Datei ein
    • Nun kopiert man den Source-Code in das Modul hinein
    • Schlussendlich muss unter Tools > References noch „Microsoft Scripting Runtime“ aktiviert werden
    • Jetzt kann man die Funktion starten, fliegt aber rasch auf die Schnauze, weil Dim iStyleCount As Integer als Integer definiert ist und deshalb überläuft
    • Nachdem der Laptop für ca. 20-30 Minuten wie totgefroren ist, erscheint dann die erlösende Meldung: Statt der ursprünglich 64999 gefundenen Styles sind nach der Bereinigung nur noch effektiv 10 verwendete Stück im Dokument
  • Beschleunigt. Da sich Microsoft des Problems bewusst ist, verlinken sie in ihrem KB-Artikel zur Fehlermeldung auf ein kostenfreies Tool eines unabhängigen Entwicklers (.NET4.0 version of the XLStylesTool is now available), welcher die Styles auf OOXML-Ebene säubert, was einen massiven Geschwindigkeitsgewinn gegenüber der VBA-Version ermöglicht. WICHTIG: Nachdem die Applikation gestartet und die Datei ausgewählt wurde, muss zwingend [x] „Commit changes …“ ausgewählt werden, damit die Anpassungen gespeichert werden können.

VBA-Code

Via: Too Many Different Cell Formats, ergänzt/überarbeitet von eMeidi.com

' Description:
'    Borrowed largely from http://www.jkp-ads.com/Articles/styles06.asp
' Additional debug message piping to .txt file in C:\ by eMeidi.com
' Bugfixing iStyleCount from Integer to Long by eMeidi.com

Option Explicit

' Description:
'    This is the "driver" for the entire module.
Public Sub DropUnusedStyles()

    Dim styleObj As Style
    Dim rngCell As Range
    Dim wb As Workbook
    Dim wsh As Worksheet
    Dim str As String
    Dim iStyleCount As Long
    Dim dict As New Scripting.Dictionary    ' <- from Tools / References... / "Microsoft Scripting Runtime"

    ' wb := workbook of interest.  Choose one of the following
    ' Set wb = ThisWorkbook ' choose this module's workbook
    Set wb = ActiveWorkbook ' the active workbook in excel
    
    Dim strPath As String
    strPath = "C:\excelFormatCleanerDebug.txt"
    Dim f
    f = FreeFile()
    Open strPath For Output As f
    'Print #f, Text

    Debug.Print "BEGINNING # of styles in workbook: " & wb.Styles.Count
    'GoTo Bla
    
    ' dict := list of styles
    For Each styleObj In wb.Styles
        str = styleObj.NameLocal
        iStyleCount = iStyleCount + 1
        Call dict.Add(str, 0)    ' First time:  adds keys
        'Debug.Print str & ", ";
        Print #f, str & ", "
    Next styleObj
    Debug.Print "  dictionary now has " & dict.Count & " entries."
    ' Status, dictionary has styles (key) which are known to workbook
    'GoTo Bla
    
    ' Traverse each visible worksheet and increment count each style occurrence
    For Each wsh In wb.Worksheets
        If wsh.Visible Then
            For Each rngCell In wsh.UsedRange.Cells
                str = rngCell.Style
                dict.Item(str) = dict.Item(str) + 1     ' This time:  counts occurrences
                Print #f, str & "+1"
            Next rngCell
        End If
    Next wsh
    ' Status, dictionary styles (key) has cell occurrence count (item)


    ' Try to delete unused styles
    Dim aKey As Variant
    On Error Resume Next    ' wb.Styles(aKey).Delete may throw error

    For Each aKey In dict.Keys

        ' display count & stylename
        '    e.g. "24   Normal"
        Debug.Print dict.Item(aKey) & vbTab & aKey
        Print #f, dict.Item(aKey) & vbTab & aKey

        If dict.Item(aKey) = 0 Then
            ' Occurrence count (Item) indicates this style is not used
            Call wb.Styles(aKey).Delete
            If Err.Number <> 0 Then
                Debug.Print vbTab & "^-- failed to delete"
                Err.Clear
            End If
            Call dict.Remove(aKey)
        End If

    Next aKey

    Debug.Print "ENDING # of style in workbook: " & wb.Styles.Count
Bla:
End Sub

Tags: , , , , , , ,
Labels: IT, Programmierung

Keine Kommentare | neuen Kommentar verfassen

Montag, 9. Juli 2012

Wenn Word 2007 bei jedem Speichern wegen Kommentaren und Änderungen nervt

The document being saved contains comments. Continue with save?

Wer sich – wie ich – über diese typische Nervensäge aus dem Hause Microsoft aufregt, dem sei hier Abhilfe empfohlen:

  1. Office-Knopf
  2. Word options
  3. Trust Center
  4. Trust Center Settings…
  5. [] Warn before printing, saving or sending a file that contains tracked changes or comments

Via: Prompts to save comments

Tags: , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Freitag, 6. Juli 2012

2004, das Jahr in welchem die Windows-Hegemonie zu bröckeln begann

When Windows 95 launched in 1995 it negated most of the advantages of the ease of use of the Macintosh and the PC market took off. The ratio reached 56 in 2004 when 182.5 million PCs were sold vs. 3.25 million Macs. […]

Then, in 2004, something happened.

Quelle: Building and dismantling the Windows advantage

Im März 2004 wurde mein PowerMac G5 geliefert, welcher mir bis zum Anfang dieses Jahres treue Dienste leistete. Ich wechselte also unbewusst just in diesem Moment von der Wintel- in die Apfel-Welt, als Microsoft auf dem Höhepunkt seiner Dominanz angekommen war.

Seit 2004 ging es nur für die Firma nur noch bergab; heute werden pro einem Apple-Geräte (Mac, iPhone, iPad) nur noch zwei Windows-Geräte verkauft. Auch das knacken wir noch …

Für jemanden, der seinerzeit den CD-ROM-Laufwerken keine Zukunft voraussagte und noch im Jahr 2000 felsenfest davon überzeugt war, noch lange ohne Mobiltelefon auszukommen, für einmal ein offensichtlich richtungsweisender Entscheid.

Tags: , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Montag, 25. Juni 2012

DVD-Laufwerk im Lenovo ThinkPad T420 sperren

Da habe ich seit einigen Wochen (eher unfreiwilligerweise) ein brandneues Lenovo ThinkPad T420 auf meinem Bürotisch auf der Arbeit stehen, doch nach einer Vielzahl von Einsätzen ausserhalb des Büros stellt sich ein riesiges Problem, welches mich bis zum heutigen Tage zur Verzweiflung trieb: Wenn ich den Laptop unachtsam anfasste, bspw. wenn ich ihn aus meiner Laptop-Tasche zog, betätigte ich unabsichtlich den Eject-Knopf des DVD-Laufwerkes, was die Laufwerkschublade aufschnappen liess.

Offenbar bin ich mit diesem Problem nicht alleine:

Every time I pick the laptop up or am laptopping in bed I am constantly hitting the DVD eject botton on the T420. This is my 10th ThinkPad over the years and have never had this problem.

Quelle: T420 DVD eject button – terrible placement; driving me insane

Da der Wechsel auf einen Laptop ohne optisches Laufwerk ein Ding der Unmöglichkeit ist (MacBook Airs sind zu leicht und es lassen sich leider keine Unmengen von Sicherheits- und Legacyapplikationen installieren, die eine Corporate IT zur Verfügung hat), hilft mir nun das Tool CDRom-Lock, welches den Eject-Button schlicht und ergreifend … deaktiviert (via Re: is there a way to disable DVD Eject button?).

Damit kann ich sehr gut leben, denn die letzte CD hielt ich vor Monaten ausgehändigt. Halleluja!

Tags: , , , , , ,
Labels: IT

1 Kommentar | neuen Kommentar verfassen

Sonntag, 22. April 2012

iTunes Sync Mail Accounts ist leer

Apples Foren sind voll davon — und auch ich bin davon betroffen: Wenn ich iOS Geräte an meinen Mac mini mit Mac OS X 10.7.3 anschliesse und sich iTunes 10.6.1 öffnet, kann ich für keines der Geräte die Synchronisation der E-Mail-Accounts aktivieren. Die Liste ist leer und das Kästchen ist ausgegraut:

Zum Vergleich die Liste Sync Calendars:

Leider hat noch niemand herausgefunden, wie das Problem auf einfache Art und Weise gelöst werden kann. Wer einige Stunden investieren will, folgt dem Ratschlag einer Antwort:

  1. Mac OS X 10.7.0 über die bestehende Installation installieren
  2. iTunes auf 10.6.1 aktualisieren
  3. Mac OS X auf 10.7.3 aktualisieren

Hier einige Links, die das Problem beschreiben:

Tags: ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 22. April 2012

iCal kann nicht mit Google Calendar kommunizieren

Seit meinem Umstieg auf Mac OS X Lion Ende Februar 2012 plagte mich das Problem, dass ich auf meinem Mac mini partout keinen Kontakt zu meinen Google Calendars herstellen konnte.

Seit ich heute hier und da ein wenig ausgemistet habe, funktioniert es plötzlich. Welche Aktion(en) die Lösung bewerkstelligt haben, kann ich leider nicht mehr sagen.

  • Reset SyncServices. Die unter ~/Library/Application Support/SyncServices/Local abgelegten Daten sollte man mit dem Befehl
    /System/Library/Frameworks/SyncServices.framework/Versions/A/Resources/resetsync.pl full

    säubern (Quelle: Mac OS X: Resetting the SyncServices folder)

  • Mail-Accounts. In der Datei ~/Library/Mail/V2/MailData/Accounts.plist lagen noch einige Leichen herum, unter anderem auch mein Gmail-Account, welchen ich nur noch über die Web-Oberfläche aufrufe. Mit viel Vorsicht (und nachdem ich eine Kopie der Datei erstellt hatte), löschte ich diesen Eintrag.
  • Two-Way Authentication. Schlussendlich schaltete ich auf Grund eines tragischen Berichts im The Atlantic über den Hack eines GMail-Accounts die Zwei-Wege-Authentifizierung inklusive Applikationspasswörtern ein.

Als ich iCal nun erneut aufrief wurde zuerst einmal der Hauptkalender synchronisiert. Anschliessend konnte ich die restlichen Kalender unter Preferences > Accounts > Google > Delegation zur Synchronisation markieren.

Tags: , , , , , ,
Labels: IT

1 Kommentar | neuen Kommentar verfassen

Sonntag, 22. April 2012

iPhoto Photo Stream ist kaputt

Seit dem Umstieg von Mac OS X Snow Leopard auf Mac OS X Lion war ich nicht in der Lage, unter iPhoto 11 den Photo Stream zu aktivieren. Der Stream wird von meinem iPhone 3GS, meinem iPhone 4S und meinem iPad 1 befüllt.

Jedes Mal wenn ich unter iPhoto 11 die Rubrik „Photo Stream“ auswählte, wurde mir angeboten, den Stream zu abonnieren:

Nachdem ich erwartungsvoll auf „Turn On Photo Stream“ klickte, starrte ich während circa 30 Sekunden auf die Dialogbox, die mir mitteilte, dass iPhoto nun mit dem iCloud-Dienst Kontakt aufnehme:

Am Ende der Wartezeit hiess es dann aber nur lapidar:

Ein Aufruf von Console.app mit der Hoffnung, detailliertere Hinweise auf den Fehler zu erhalten, bot in der Tat ein tragisches Bild. Eine Filterung nach „Photostream“ förderte sich alle drei Sekunden wiederholende Fehlermeldungen zu Tage:

22.04.12 20:13:50.787 ReportCrash: Saved crash report for PhotoStreamAgent[37000] version 2.1 (10.12) to /Users/mario/Library/Logs/DiagnosticReports/PhotoStreamAgent_2012-04-22-201350_Mac-Mini.crash
22.04.12 20:13:50.859 PhotoStreamAgent: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive version (4294967295)'
*** First throw call stack:
(
	0   CoreFoundation                      0x00007fff8fb78fc6 __exceptionPreprocess + 198
	1   libobjc.A.dylib                     0x00007fff96d86d5e objc_exception_throw + 43
	2   CoreFoundation                      0x00007fff8fb78dfa +[NSException raise:format:arguments:] + 106
	3   CoreFoundation                      0x00007fff8fb78d84 +[NSException raise:format:] + 116
	4   Foundation                          0x00007fff8f3e263f -[NSKeyedUnarchiver initForReadingWithData:] + 2611
	5   Foundation                          0x00007fff8f41159e +[NSKeyedUnarchiver unarchiveObjectWithFile:] + 129
	6   CoreMediaStream                     0x00000001001d09a0 -[MSCupidStateMachine initWithPersonID:] + 379
	7   CoreMediaStream                     0x00000001001b6639 -[MSSubscriber initWithPersonID:baseURL:] + 59
	8   CoreMediaStream                     0x00000001001b383d +[MSSubscriber subscriberForPersonID:] + 172
	9   CoreMediaStream                     0x00000001001a9256 -[MSMediaStreamDaemon _boundSubscriberForPersonID:] + 43
	10  CoreMediaStream                     0x00000001001a87d6 -[MSMediaStreamDaemon pollForSubscriptionUpdatesForPersonID:] + 48
	11  PhotoStreamAgent                    0x00000001000034fb -[AssetManagementDaemon startDaemon] + 491
	12  PhotoStreamAgent                    0x0000000100002f87 -[AssetManagementDaemon run] + 151
	13  libdispatch.dylib                   0x00007fff8a065224 dispatch_once_f + 53
	14  PhotoStreamAgent                    0x000000010000264c +[AssetManagementDaemon run] + 124
	15  PhotoStreamAgent                    0x0000000100001723 main + 67
	16  PhotoStreamAgent                    0x00000001000016d4 start + 52
)
22.04.12 20:13:50.863 com.apple.photostream-agent: terminate called throwing an exception
22.04.12 20:13:50.972 ReportCrash: Removing excessive log: file://localhost/Users/mario/Library/Logs/DiagnosticReports/PhotoStreamAgent_2012-04-22-200644_Mac-Mini.crash

Was hatte es mit incomprehensible archive version (4294967295) auf sich? Eine Google-Suche brachte die Lösung des Problems (nicht aber eine Erläuterung) zu Tage:

I found a fix! you just need to delete ~/Library/Application Support/iLifeAssetManagement and then reboot, and then it should work.

Quelle: aperture unable to connect to photo stream

Nach einem

rm -rf ~/Library/Application\ Support/iLifeAssetManagement

und einem Logout gefolgt von einem erneuten Login in meinen Mac-Account brachte die Erlösung: Nach dem Klick auf Enable Photo Stream dauerte es etwa 30 Sekunden, danach füllte sich der Stream mit Photos von meinen iOS-Geräten.

Tags: , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 17. April 2012

Microsoft Access meldet „Overflow“

Heute meldete mir Microsoft Acceess äusserst nichtssagend „Overflow“, als ich ein Query ausführen wollte. Wie sich nach einigem Debugging herausstellte, versuchte ich, den Wert eines Tabellenfeldes mit einem Wert eines anderen Tabellenfeldes zu dividieren, wobei der Nenner 0 war.

Merke:

  1. Access-Fehlermeldungen sind Microsoft-typisch nichtssagend …
  2. … und zudem auch noch falsch, es hätte nämlich „Division by Zero“ heissen sollen

Tags: , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Montag, 2. April 2012

Einen Amazon S3-Bucket leeren und dann löschen

Vor einiger Zeit bin ich von JungleDisk auf tarsnap migriert. Als sozusagen „letzte“ Amtshandlung gehört nun dazu, dass ich den Amazon S3-Bucket lösche. Dies ist gar nicht so einfach, weil nur leere Buckets gelöscht werden können — das heisst, alle darin gespeicherten Objekte müssen zuerst entfernt werden.

Da mir die Sache mit Cyberduck zu langwierig erschien (und gelegentlich zu komischen Fehlermeldungen führte), habe ich mich nach einem Kommandozeilen-Tool umgesehen.

s3sync

Fündig wurde ich mit s3sync. Diese Sammlung von Ruby-Scripts erlaubt es, mit Amazon S3 zu kommunizieren.

Nachdem ich die Script-Sammlung heruntergeladen und entpackt hatte, musste ich zuerst die zwingend benötigte Konfigurationsdatei unter $HOME/.s3conf/s3config.yml ablegen. Deren Inhalt:

AWS_ACCESS_KEY_ID: ...
AWS_SECRET_ACCESS_KEY: ...

AWS_CALLING_FORMAT: SUBDOMAIN

Der Kommandozeilenbefehl zum Löschen der Dateien im Bucket lautete folgendermassen:

./s3cmd.rb -v deleteall jd2-5d95f837098760279d8c32d215671111-eu

Quelle: How to delete an Amazon S3 bucket with lots of files in it

Zeichensatz-Problem

Leider gab es — wohl auf Grund der Herkunft meiner Dateien von einem Mac OS X-Dateisystem — immer wieder folgende Fehlermeldung:

./s3cmd.rb:119:in `iconv': "\314\210s Text innen2 "... (Iconv::IllegalSequence)
        from ./s3cmd.rb:119:in `s3cmdMain'
        from ./s3cmd.rb:245

Deshalb empfiehlt es sich, den Programmcode an zwei Stellen anzupassen, in welchen auf iconv zurückgegriffen wird:

... Iconv.iconv($S3SYNC_NATIVE_CHARSET, ...

wird zu

... Iconv.iconv($S3SYNC_NATIVE_CHARSET + "//IGNORE", ...

Quelle: Ignore Iconv::IllegalSequence while using Ruby WWW::Mechanize

Tags: , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen