Hallo,

ich nehme an Du verwendest eine normale Windows-Form für Dein Programm. Dann schau Dir mal das Ereignis "FormClosing" für Deine Form an. Packe den Code für den Mailversand da rein und ab sofort wird beim Schliessen des Programmes der Code ausgeführt.

...zur Antwort

Das ist VBA-Code und wird im Visual Basic-Editor eingegeben:

  • platziere das Drehfeld auf Deinem Tabellenblatt
  • Rechtsklick auf das Drehfeld und "Code anzeigen" auswählen
  • lösche den Text "Private Sub SpinButton1_Change()" und "End Sub"
  • füge den Code aus Deiner Frage ein

Wenn nun in A1 eine Zahl steht, dann wird auf jeden Drehfeld-Klick 0,1 addiert oder subtrahiert.

...zur Antwort

Prinzipiell geht das. Kann man das Programm, welches Du steuern willst auch komplett mit der Tastatur bedienen? Dann funktioniert das sogar relativ problemlos. Dazu solltest Du Dir mal die Klasse SendKeys von .NET anschauen. Damit kannst Du recht komfortabel Tastatur-Befehle an andere Programme senden.

...zur Antwort

Hallo,

ich nehme an, Dein Problem ist, daß beim Einfügen des Clipboard-Textes ins Notepad die RTF-Formtierungsbefehle erhalten bleiben, oder? Das Ganze sieht dann wahrscheinlich wie in Bild 1 aus.

Kleiner Workaround: Wenn Du nicht die RTF-Eigenschaft sondern die TEXT-Eigenschaft der RichTextBox ausliest, erhälst Du den Text ohne Formatierungsbefehle. Nun ist das Problem, daß Deine Texte nicht in einer RichTextBox gespeichert sind, sondern in einem String-Array. Setze daher eine nicht sichtbare RichTextBox auf Dein Formular (Visible=False) übergib den Text aus dem Array an die RichTextBox und lese die TEXT-Eigenschaft der RichText-Box aus.

Kleine Einschränkung: Du weißt nicht, ob die Client-Anwendung (in die Dein Text eingefügt wird) RTF-fähig (wie z.B. Word) oder Plain-Text-fähig (wie z.B. Notepad) ist. Ich habe auch überhaupt keinen Lösungsansatz, wie man das feststellen kann. Entweder Du übergibst IMMER Plain-Text oder Du lässt den Anwender auswählen (z.B. über 2 Button) ob er formatierten oder unformatierten Text einfügen will.

Hoffe, es hilft Dir etwas weiter.

...zur Antwort

Würde es ja eher mit nem Makro machen aber folgende Formel sollte Dein Problem eigentlich auch lösen.

Schreibe in Zelle C1 die Formel

  =WENN($A$1+ZEILE()-1<=$A$2;$A$1+ZEILE()-1;"")

kopiere diese in beliebig viele Zellen in Spalte C (von mir aus in alle 65536 Zeilen) - fertig. Das ganze brauchst Du natürlich nur einmalig machen, ab sofort werden alle Zellen der Spalte C mit A1...A2 ausgefüllt. Alle Zellen in denen der Wert > A2 wäre werden mit nem leeren String beschrieben.

...zur Antwort

Hallo,

das kannst Du wie folgt abfragen:

If ListBox1.SelectedIndex > 0 Then 
    'Befehl
End If

ListBox1.SelectedIndex gibt den Index des markierten Elements zurück. Wenn kein Element selektiert ist, dann wird -1 zurück gegeben.

...zur Antwort

Hallo, Deinen Ansatz ist schon richtig. Das DataSet ist ja vielmehr ein Container, um Daten-Tabellen zu verwalten. Und ein DataSet beschreibt man nicht direkt, sondern die Werte werden in eine Tabelle in Deinem DataSet geschrieben. Das ganze erfolgt dann so:

 DataSet.Tables("Name der Tabelle").Rows(Zeilennr).Item("Name der Spalte") = "Text"

Ich glaube, Du brauchst aber nur eine einzige Tabelle und kannst damit auf ein DataSet verzichten.

Nehmen wir mal an, Du verwaltest Deine Clipboard-Einträge in einer 2-spaltigen Tabelle: Spalte 1 nenne ich mal "Titel" und Spalte 2 "Inhalt". Das folgende Beispiel veranschaulicht, wie man eine DataTable erstellt, diese speichert und wieder ladet (auf ein DataSet wird verzichtet, da es nur um eine Tabelle geht):

Platziere dazu auf einer Form 3 Button (mit Namen "Speichern", "Laden" und "CreateSampleData") und ein DataGridView.

Imports System.IO
Public Class Form1
    Dim path As String = "c:\test.txt"
    Dim dt As New DataTable("Clipboard-Tabelle")

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim col1 As New DataColumn("Titel", GetType(String))
    Dim col2 As New DataColumn("Inhalt", GetType(String))
    dt.Columns.Add(col1)
    dt.Columns.Add(col2)
    DataGridView1.DataSource = dt
End Sub

Private Sub Speichern_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Speichern.Click
    Dim str As New StreamWriter(path)
    dt.WriteXml(str)
    str.Close()
End Sub

Private Sub Laden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Laden.Click
    Dim str As New StreamReader(path)
    dt.ReadXml(str)
    str.Close()
End Sub

Private Sub CreateSampleData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CreateSampleData.Click
    Dim row As DataRow
    row = dt.NewRow
    row(0) = "Titel1"
    row(1) = "Das ist der text zu Titel 1"
    dt.Rows.Add(row)
    row = dt.NewRow
    row(0) = "Titel2"
    row(1) = "Das ist der text zu Titel 2"
    dt.Rows.Add(row)
    row = dt.NewRow
    row(0) = "Ein anderer Titel"
    row(1) = "Hier steht wieder Text"
    dt.Rows.Add(row)
    row = dt.NewRow
    row(0) = "Zahlen"
    row(1) = "123 4571 474 521"
    dt.Rows.Add(row)
    row = dt.NewRow
    row(0) = "Quatsch"
    row(1) = "Wer das liest ist doof!"
    dt.Rows.Add(row)
End Sub

End Class

Zur Erklärung:

In path ist Name und Pfad zu Deiner Datei angegeben.

dt ist die Variable für die Tabelle "Clipboard-Tabelle".

In Form1_Load erfolgt einfach die Zuordnung der Spalten und die Bindung an das DataGridView.

Speichern-Click öffnet einen StreamWriter und schreibt den Inhalt der Tabelle in die Datei path. Bei Laden-Click gehts umgekehrt.

CreateSampleData-Click dient nur zum Füllen der Tabelle mit ein paar Beispieldaten.

Das ganze sieht dann aus wie in den Bildern unten.

Um jetzt z.B. den Text in der Zelle "Wer das liest ist doof!" zu ändern, kannst Du ganz einfach schreiben:

    dt.Rows(4).Item(1) = "Wer das liest ist schlau!"

Hoffe, es hilft Dir etwas weiter.

...zur Antwort

Der Fehler wird offensichtlich durch "tbnavigator.exe" ausgelöst. Was ist denn tbnavigator.exe? Ein von Dir erstelltes Programm, eine externe Anwendung, die Du von Deinem Prog aus aufrufst? Kann man tbnavigator.exe separat starten? Oder fehlt diese EXE-Datei vielleicht auf dem anderen Computer?

...zur Antwort

Die einfachste Lösung ist sicherlich, dafür Excel zu verwenden. Aber wenn es wirklich eine eigenständige Anwendung sein soll, so kannst Du mit VB.NET und drei Zeilen Code so eine Mini-Anwendung erstellen:

platziere 2 Textboxen, einen Button und 3 Labels auf einem Formular und gib folgenden Code für das OnClick-Ereignis des Buttons an:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim a As Decimal = CDec(TextBox1.Text)
    Dim b As Decimal = CDec(TextBox2.Text)
    Label3.Text = "Ergebnis: " & (40 + (a - (b - 30)) * 1.19).ToString
End Sub

Das ganze sieht dann wie im Bild aus.

Anmerk.: Habe hier der Einfachheit halber auf 'ne Exception-Behandlung verzichtet.

...zur Antwort

Der Code ist korrekt. Vermutlich stimmen Anmeldedaten oder Empfängeradresse nicht und daher generiert der SMTP-Server eine Fehlermeldung. Du soltest unbedingt die konkrete Fehlermeldung mit angeben.

Versuche es mal mit folgendem Code und prüfe die Ausgabe der MsgBox:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim text As String
    text = textbox1.text & textbox2.text & vbLf
    Dim myclient As New Net.Mail.SmtpClient("smtp.web.de")
    myclient.Credentials = New NetworkCredential("xxxxxx@web.de", "xxxxxxxx")
    Try
        myclient.Send("xxxxxx@web.de", "xxxxxx@web.de", "Test1", text)
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Wenn beispielsweise der SMTP-Server-Name falsch ist, erhälst Du folgende Meldung: "Fehler beim Senden von Mail."

Bei fehlerhaften Anmeldedaten kann folgende Meldung erscheinen: "Postfach nicht verfügbar. Die Serverantwort war: 5.7.0 Need to authenticate via POP3 first."

Anmerkung: Du möchtest bestimmt den Inhalt der beiden Textboxen in der Mail ausgeben. Dann sind die Anführungszeichen bei text = ..... verkehrt.

...zur Antwort

Hallo,

Du kannst in VBA mittels Shell Kommandozeile externe Anwendungen starten. Um dann Makros im Excel auszuführen greifst Du entweder auf den SendKeys-Befehl zurück (rate ich aber davon ab) - besser Du packst die Makros in eine Workbook_Open-Routine Deiner Excel-Datei.

Das Ganze kann dann wie folgt aussehen:

Word-Makro:

Sub Makro1()
   Shell "c:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE c:\Ablage\Mappe1.xls"
End Sub

Excel-Makro:

Private Sub Workbook_Open()
  MsgBox ("Hello World!")
End Sub

Einziger "Wermutstropfen":

  • Du musst beim Start von Excel die Sicherheitsabfrage bestätigen (oder die Sicherheit runter drehen <-- nicht gut / oder Makro signieren <-- gut)
  • das Makro wird auch ausgeführt, wenn Du die Excel-Datei manuell öffnest.
...zur Antwort

Hallo,

starte im Excel den Visual Basic-Editor (Extras --> Makro --> Visual Basic-Editor) und wähle im Projekt-Explorer Dein Projekt und das entsprechende Tabellenblatt aus (s. Bild). Gib dann im Codefenster folgenden Code ein:

 Private Sub Worksheet_Change(ByVal Target As Range)
     If Range("D19").Value = "Falsch" Then Range("D20").Value = ""
 End Sub

Das Makro wird ab sofort jedesmal aufgerufen, wenn in Deinem Tabellenblatt ein Wert geändert wird.

...zur Antwort

Hi, antworte Dir hier nochmal separat, da ich zwei Bilder angehängt habe (was bei Kommentaren nicht geht).

Also wenn ich Dich recht verstehe, willst Du Internet-Seiten mit Bild und Text ins Excel kopieren und anschließend die Bilder löschen. Dieser Vorgang soll mehrmals wiederholt werden, wobei Excel jedesmal den Zähler für die Bilddateien erhöht. Soweit richtig?

Mit folgendem Codebeispiel sollte Dich der von Excel vergebene Name nicht interessieren, da das ganze über eine For Each-Schleife abgearbeitet wird. Hier kommts dann auch nicht zu einem Zählerüberlauf. Die 4 oder 5 Objekte, die Du selbst erstellt hast und die nicht gelöscht werden sollen nimmst Du explizit heraus.

Dim o As Object
For Each o In ActiveSheet.Shapes
   If o.Name <> "Bild 1" And o.Name <> "Bild 2" And o.Name <> "Bild 3" And o.Name <> "Bild 4" Then
        o.Delete
   End If
Next

Im folgenden Beispiel (s. Bild 1) sind die auszuschließenden Objekte mit "Bild 1" bis "Bild 4" benannt. Nach dem Ausführen des Skriptes sind alle Bilder (bis auf die erwähnten 4) gelöscht (s. Bild 2).

Vielleicht hilft Dir das weiter?

...zur Antwort

Normalerweise solltest Du die eingefügten Bilder über ActiveSheet.Shapes("Name des Bildes") ansprechen können. Für "Name des Bildes" steht der im Namensfeld angezeigte bzw. zugewiesene Name. Beim Einfügen aus anderen Anwendungen bekommen die Bilder normalerweise die Namen "Bild 1", "Bild 2" oder "Objekt 1", "Objekt 2" usw. zugewiesen.

Um jetzt den Namen (und damit den Zähler) zu ändern weist Du im VBA-Code einfach einen neuen Namen zu. Bsp.:

  ActiveSheet.Shapes("Alter Name").Name = "Neuer Name"

Hilft Dir das weiter? Wenn nicht, dann poste mal nen Stück Quellcode.

...zur Antwort

Du kannst Dir die Zeichen innerhalb der Klammern über eine Excel-Funktion zurückgeben. Bsp. steht der Text in Spalte A1 dann gib folgende Formel ein:

=WENN(ISTFEHLER(FINDEN("(";A1));"";TEIL(A1;FINDEN("(";A1)+1;FINDEN(")";A1)-FINDEN("(";A1)-1))

Möchtest Du den Ergebnis-Text an anderer Stelle weiterverwenden, so einfach alles kopieren und über "Bearbeiten --> Inhalte einfügen... --> Werte" die Ergebniswerte einfügen.

...zur Antwort

Zähle doch ganz einfach die Buchstaben mit, und wenn eine Grenze (z.B. 15) überschritten ist, dann durfen nur noch Zahlen verwendet werden:

        TextBox1.Clear()
        Dim rnd As New Random
        Dim char_count As Integer = 0
        Dim r As Integer
        For i As Integer = 0 To 31
            If i = 8 Or i = 12 Or i = 16 Or i = 20 Or i = 32 Then
                TextBox1.Text &= "-"
            End If
            r = rnd.Next(0, 36)
            If r < 10 Then
                TextBox1.Text &= r
            Else
                char_count += 1
                If char_count > 15 Then
                    i -= 1
                    Continue For
                End If
                r = r - 10
                TextBox1.Text &= Chr(65 + r)
            End If
        Next

Hier mein Test-Ergebnis: J5AMA5QR-E0TY-FL93-G29U-X03M44054871

Allerdings wirst Du immer am Anfang Deiner Zeichenkette mehr Buchstaben und am Ende mehr Zahlen haben. Kein Wunder - bei 26 Buchstaben und 10 Zahlen ist die Wahrscheinlichkeit, einen Buchstaben zu erhalten fast dreimal so groß.

Hoffe, es hilft Dir weiter!

...zur Antwort

Hallo,

Du kannst mittels ADO.NET über den OLE-DB-Provider ganz einfach auf Access-Datenbanken zugreifen. Hierzu wird kein Access aufgerufen - es muss nicht einmal auf dem Rechner, auf welchem Deine Anwendung laufen soll, installiert sein (zum Designen der Datenbank solltest Du allerdings schon Access verwenden).

Folgender Beispiel-Code zeigt Dir den Zugriff auf eine Access-Tabelle:

Imports System.Data.OleDb

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\_Ablage\Dateiuebertragung.mdb")
    Dim da As New OleDbDataAdapter()
    Dim dt As New DataTable()
    Try
        da.SelectCommand = New OleDbCommand("SELECT * FROM auftrag", cn)
        da.Fill(dt)
        DataGridView1.DataSource = dt
    Catch ex As Exception
        MsgBox("Es ist ein Fehler aufgetreten: " & vbCrLf & ex.Message)
    End Try
End Sub

End Class

Nun noch eine DataGridView-Komponente auf Deinem Formular platziert und schon solltest Du die Daten angezeigt bekommen. Aktualisieren, einfügen und löschen von Daten kannst Du über die DataAdapter.Update-Methode (vorausgesetzt, es sind die entsprechenden Abfragen in DataAdapter.UpdateCommand, .InsertCommand und .DeleteCommand hinterlegt). Weitere Infos findest Du in der Online-Hilfe oder im Internet unter ADO.NET oder DataAdapter.

Einfacher gehts noch mit dem DataSet-Designer vom Visual-Studio, weiß aber nicht ob der in den Express-Versionen enthalten ist.

...zur Antwort

Wenn die Nummer der PictureBox mit der Nummer der BMP-Datei übereinstimmt könnte folgendes Vorgehen funktionieren:

Dim pb As PictureBox

For Each ctrl As Control In Me.Controls

pb = TryCast(ctrl, PictureBox)

If IsNothing(pb) Then Continue For

pb.ImageLocation = "C:\temp\pic" & pb.Name.Remove(0, "PictureBox".Length) & ".jpg "

Next

Hinweis: Die For-Each-Schleife durchläuft alle Controls Deiner Form. Mit TryCast wird eine Typkonvertierung in PictureBox eingeleitet. Und nur wenn es sich bei dem Control um eine PictureBox handelt (pbNothing) dann wird die Nummer aus dem Namen der PictureBox extrahiert ( pb.Name.Remove(0, "PictureBox".Length) ).

Hoffe, es hilft Dir weiter.

...zur Antwort