Ob es sinnvoll und sicher ist, das will ich nicht erörtern. Manches machen wir ja auch einfach nur, um zu verstehen ob und wie es gehen könnte.

Besser als ein Raspi erscheint mir für den Zweck ein ESP8266, der WLAN an Bord hat. Kostet je nach Quelle weniger als 5 Euro und ist kaum größer als eine Briefmarke. Stromversorgung könnte man (ggfs. Spannung anpassen) aus der Sprechanlage ziehen. Dann über einen GPIO ein Relais ansteuern, das den Taster überbrückt.

Kosten für die Hardware vermutlich keine 10 Euro.

Als Software käme die TASMOTA Firmware in Frage. Dort kannst Du die Funktionen der einzelnen GPIO Ports einstellen und natürlich auch die WLAN Zugangsdaten hinterlegen.

Dann kannst Du die Wohnungstür über einen Browser oder über eine Hausautomatisierungs-Sowtware öffnen.

Ich habe das so ähnlich für die Steuerung meines Garagentors gemacht und frage mit zwei zusätzlichen Reed Kontakten den Zustand desTors ab.

Viel Spaß und berichte doch mal, ob und wie Du es angehst.

...zur Antwort

Ja, das geht.

Eine graphische Oberfläche kannst Du direkt mit der Installation aufsetzen, indem Du ein entsprechend vorbereitetes Image auswählst.

Ich nutze Anydesk und kann mich damit problemlos remote auf den Pi aufschalten. Teamview habe ich noch nicht verwendet, sollte aber auch funktionieren.

Da Du die graphische Oberfläche nutzen willst, ist mehr Rechenpower definitiv vorteilhaft. Und da die Preisunterschiede nun wirklich nicht gewaltig sind, würde ich einen Pi V4 mit 4 oder besser noch 8 GB nehmen.

...zur Antwort

Habe einen Weg gefunden, wie du ohne VBA einzelne Würfel stehen lassen kannst und andere zurück in den Knobelbecher wirfst.

Vorbereitung: In den Excel-Optionen unter Berechnen/Formeln Iterative Berechnungen erlauben. Als Anzahl Maximale Iterationsschritte reicht eine 1. Ohne diese Einstellung würden die folgenden Formeln Zirkelbezüge erzeugen, die eine Warnmeldung auslösen.

Für die Tabelle die Berechnungsoption auf Manuell stellen, damit Du mit F9 neu würfeln kannst.

Hier die Tabelle:

Bild zum Beitrag

Die Formel für A2 lautet: =WENN(A3="x";ZUFALLSBEREICH(A2;A2);ZUFALLSBEREICH(1;6))

Wenn In Zeile 3 ein x steht, wird eine Zufallszahl berechnet, deren untere und obere Grenze gleich der Zahl in Zeile 2 ist, also der letzten mit diesem Würfel gewürfelten Zahl. Im Ergebnis bleibt der Wurf damit stehen.

Steht dort kein x, wird eine Zufallszahl zwischen 1 und 6 erzeugt, also neu gewürfelt.

...zur Antwort

Soweit ich weiß, kann eine VBA Funktion nicht in eine andere Zelle schreiben, sondern nur lesen. Die Funktion kann nur den Wert der Zelle beeinflussen, aus der sie aufgerufen wird.

Was Du vorhast, geht nur über eine Sub().

...zur Antwort

Ich denke auch, dass die Qualität grundsätzlich ähnlich ist. Bei den geringen Stückzahlen, die man als Privatperson in die Finger bekommt, wird man kaum sagen können, dass eine Quelle schlechter ist als die andere.

Da Du mit solchen Geräten ohnehin keine lebenswichtigen System steuern solltest, sind die Qualitätsunterschiede vermutlich unkritisch. Was aber häufig zählt, ist die Lieferzeit. Und da sind europäische Lieferanten spürbar im Vorteil. Und mit jedem Kauf bei einem hiesigen Lieferanten unterstützen wir auch dessen Support-Angebot, das wir im Fall von offenen Fragen ja auch gerne nutzen.

...zur Antwort

Ich habe die Formeln nicht parat, würde das aber so angehen.

Molmasse KOH = 56 g/mol.

4 g entsprechen dann 0,0714 mol

Deren Lösungsenthalpie beträgt dann gerundet -4,1 kJ, das heißt diese Energiemenge wird freigesetzt, wenn 4 g KOH in Wasser gelöst werden.

Um 100 g Wasser um 1 Kelvin zu erwärmen, werden 0,42 kJ benötigt.

Ich denke daher, dass die Temperatur der 100 ml Wasser um ca. 9,7 K steigt.

...zur Antwort
VBA Laufzeitfehler/ Error/ Programm hängt sich auf?

Hallo zusammen,

Ich habe ein Makro geschrieben, mit welchem jeweils via Button eine neue Spalte eingefügt wird.

Über den Button Spalten entfernen wird die jeweils ausgewählte Spalte gelöscht.

Private Sub CmdSpaltePlus_Click() 'Test Spalte hinzufügen

Dim spalte, zeile As Integer

Application.ScreenUpdating = False

spalte = 4

Do Until Cells(2, spalte).Value = "Perfektion"

   spalte = spalte + 1

Loop

Columns("D:E").Copy

Columns(spalte).Insert Shift:=xlToRight

Range(Cells(2, spalte - 2), Cells(2, spalte + 1)).Merge

Range(Cells(4, spalte), Cells(4, spalte + 1)).Merge

Cells(3, spalte).Value = ""

Cells(3, spalte + 1).Value = ""

Cells(4, spalte).Value = ""

Cells(4, spalte + 1).Value = ""

zeile = 6

 

Do Until zeile = 1000

   If Left(Cells(zeile, 1).Value, 1) = "S" Then

        Cells(zeile, spalte).Value = ""

       Cells(zeile, spalte + 1).Value = ""

    End If

   zeile = zeile + 1

Loop

Application.ScreenUpdating = True

End Sub

 

Private Sub CmdPerfektionPlus_Click() 'Perfektion Spalte hinzufügen

Dim spalte, zeile As Integer

Application.ScreenUpdating = False

spalte = 4

Do Until Cells(2, spalte).Value = "F.n.B."

   spalte = spalte + 1

Loop

Columns("D:E").Copy

Columns(spalte).Insert Shift:=xlToRight

Range(Cells(2, spalte - 2), Cells(2, spalte + 1)).Merge

Range(Cells(4, spalte), Cells(4, spalte + 1)).Merge

Cells(3, spalte).Value = ""

Cells(3, spalte + 1).Value = ""

Cells(4, spalte).Value = ""

Cells(4, spalte + 1).Value = ""

zeile = 6

Do Until zeile = 1000

   If Left(Cells(zeile, 1).Value, 1) = "S" Then

        Cells(zeile, spalte).Value = ""

       Cells(zeile, spalte + 1).Value = ""

    End If

   zeile = zeile + 1

Loop

Application.ScreenUpdating = True

End Sub

Spalten löschen

Private Sub Kompetenzenentfernen_Click() 'Spalten löschen

ActiveSheet.Unprotect Password:="MNPS"

If Cells(5, ActiveCell.Column) = "Schicht" Or Cells(5, ActiveCell.Column) = "Nr." Or Cells(5, ActiveCell.Column) = "Name" Or Cells(3, ActiveCell.Column) = "A1" Or Cells(3, ActiveCell.Column) = "D1" Or Cells(9, ActiveCell.Column) = "." Or Cells(3, ActiveCell.Column) = "E1" Or Cells(3, ActiveCell.Column) = "F1" Or Cells(3, ActiveCell.Column) = "G1" Or Cells(3, ActiveCell.Column) = "H1" Or Cells(2, ActiveCell.Column) = "." Or Cells(1, ActiveCell.Column) = "Zielwert" Then

MsgBox "Spalte kann nicht gelöscht werden"

Else

Selection.EntireColumn.Delete Shift:=xlUp

End If

'ActiveSheet.Protect Password:="MNPS"

End Sub

Die Buttons funktionieren auch alle, nur leider kommt oft eine Laufzeitfehlerneldung oder das ganze Programm hängt sich auf wenn ich erst mit dem einen Button eine Spalte eingefügt habe und im Anschluss mit dem anderen Button eine Spalte einfügen.

Es funktioniert also leider nicht verlässlich. Hat jemand eine Idee woran das liegen könnte?

Vielen Dank im Voraus!

...zur Frage

Poste doch den Code bitte auch als Code, dann wird er besser lesbar.

An welcher Stelle kommt denn die Fehlermeldung und wie lautet sie?

Kann es daran liegen, dass Du verbundene Zellen in der Tabelle hast? Excel kann da schon mal etwas zickig werden. Wenn irgendwie möglich (und das ist es eigentlich immer!), solltest Du darauf verzichten.

Die Zeile

Selection.EntireColumn.Delete Shift:=xlUp

ergibt keinen Sinn. Wenn Du eine ganze Spalte löschst, was soll denn da nach oben geschoben werden?

...zur Antwort
VBA Message-Box mit zwei Bedingungen?

Hallo zusammen,

ich versuche eine Message-Box in Excel zu erzeugen, die beim Wechsel eines Worksheets bald fällige bzw. überfällige Termine anzeigt. Dabei stehen die Fälligkeiten in der Spalte K. Eine solche Meldung soll allerdings unterbleiben, sofern der Bearbeitungsstand auf "abgeschlossen" gesetzt wurde. Der Bearbeitungsstand wird in der Spalte N mittels Dropdown-Liste erfasst.

Mein Code sieht folgendermaßen aus:

Private Sub Worksheet_Activate()

 Dim rDatTermin

 Dim rDatStand

 Dim sMsgBaldFaellig As String

 Dim sMsgUeberFaellig As String

 Dim sMsgAbgeschlossen As String

 sMsgBaldFaellig = ""

 sMsgUeberFaellig = ""

 For Each rDatTermin In Range("K4:K500")

   If rDatTermin.Value <> "" Then

     If rDatTermin.Value < Date Then

       sMsgUeberFaellig = sMsgUeberFaellig & Cells(rDatTermin.Row, 2) & vbCrLf

     Else

       If rDatTermin.Value <= Date + 14 Then _

         sMsgBaldFaellig = sMsgBaldFaellig & Cells(rDatTermin.Row, 2) & vbCrLf

     End If

   End If

   Next

 For Each rDatStand In Range("N4:N500")

   If rDatStand.Value <> "" Then

     If rDatStand.Value = "abgeschlossen" Then _

       sMsgAbgeschlossen = 1

     End If

   Next

 If sMsgUeberFaellig & sMsgBaldFaellig <> "" & sMsgAbgeschlossen <> 1 Then

   MsgBox "Überfällig" & vbCrLf & vbCrLf & sMsgUeberFaellig & "Bald fällig" & vbCrLf & sMsgBaldFaellig

 End If

End Sub

Offensichtlich klappt hier die Verknüpfung zur zweiten Bedingung noch nicht. Die erste Bedingung wird geprüft und korrekt angezeigt. Der Bearbeitungsstand wird dabei jedoch nicht berücksichtigt. Wo habe ich da meinen Gedankenfehler?

...zur Frage

Ich verstehe den Abluaf nicht. Erst gehst Du durch die Liste aller termine und baust einen String zusammen, der alle überfälligen und bald fälligen Termine enthält, unabhängig davon, ob die Aufgabe erledigt ist oder nicht.

Dann prüfst Du den Status und wenn irgenein Status "abgeschlossen" lautet, setzt Du ein Flag.

Versuche doch mal folgenden Code:

Option Explicit
Private Sub Worksheet_Activate()
 Dim rDatTermin
 ' Dim rDatStand
 Dim sMsgBaldFaellig As String
 Dim sMsgUeberFaellig As String
 'Dim sMsgAbgeschlossen As String
 sMsgBaldFaellig = ""
 sMsgUeberFaellig = ""
 
For Each rDatTermin In Range("K4:K500")
 If Cells(rDatTermin.Row, 14) <> "abgeschlossen" Then
   If rDatTermin.Value <> "" Then
     If rDatTermin.Value < Date Then
       sMsgUeberFaellig = sMsgUeberFaellig & Cells(rDatTermin.Row, 2) & vbCrLf
     Else
       If rDatTermin.Value <= Date + 14 Then _
         sMsgBaldFaellig = sMsgBaldFaellig & Cells(rDatTermin.Row, 2) & vbCrLf
        End If 
    End If
   End If
 End If
Next

 If sMsgUeberFaellig <> "" Or sMsgBaldFaellig <> "" Then
   MsgBox "Überfällig" & vbCrLf & vbCrLf & sMsgUeberFaellig & "Bald fällig" & vbCrLf & sMsgBaldFaellig
 End If
End Sub

Klappt es? Freue mich auf Feedback.

...zur Antwort

Hi,

das konkrete Datum, also Geburtsdatum + 65 Jahre + x Monate (0<=x<=24) kannst Du auch ohne Hilfstabelle mit dieser Formel berechnen, wobei das Geburtsdatum in A2 steht:

=DATUM(JAHR(A2)+65;MONAT(A2)+MAX(MIN((JAHR(A2)-1946)+MAX(JAHR(A2)-1958;0);24);0);TAG(A2))

Wenn Du einen Schritt weiter gehen willst und auf den ersten Tag des Folgemonats hochrechnen willst, es sei denn, der Geburtstag ist selbst bereits an einem 1. eines Monats, dann geht diese Formel:

=DATUM(JAHR(DATUM(JAHR(A2)+65;MONAT(A2)+MAX(MIN((JAHR(A2)-1946)+MAX(JAHR(A2)-1958;0);24);0);TAG(A2))-1);MONAT(DATUM(JAHR(A2)+65;MONAT(A2)+MAX(MIN((JAHR(A2)-1946)+MAX(JAHR(A2)-1958;0);24);0);TAG(A2))-1)+1;1)

Löst das Deine Aufgabenstellung?

Gruß

Hannes

...zur Antwort

Du kannst unter Ansicht die Anzeige der Überschriften, also der Spaltenköpfe und Zeilennummern ausblenden und dann eigene Überschriften definieren. Aber intern wird Excel für alle Berechnungen weiter mit den Spalten und Zeilennummern rechnen.

Bild zum Beitrag

Vielleicht bringt Dich das ja weiter.

Gruß

Hannes

...zur Antwort

Und auf die Windrichtung. Wenn der Wind quer zur Bahn steht und Du mit dem Modell nicht sehr vertraut bist, solltest Du auf günstige Bedingungen warten.

Start und Landung genau gegen solchen Wind sind möglich, aber für einen Anfänger nicht ungefährlich.

Allzeit gute Landungen!
Hannes

...zur Antwort

Wenn Du wirklich nur Text1 bzw. Text 2 (ohne das blabla: davor) haben willst, wird es etwas komplizierter. Dann müssten folgende Formeln funktionieren. Probier's mal aus.

Der Ausgangstext steht in A1.

=TEIL(A1;FINDEN(":";A1)+2;FINDEN("|";A1)-FINDEN(":";A1)-4)
liefert Text1.

=TEIL(A1;FINDEN(":";A1;FINDEN(":";A1)+1)+2;999)
liefert Text2.

...zur Antwort

Hi,

VBA ist keine Funktion, sondern eine Programmierumgebung, in der Du z.B. eigene Funktionen programmieren kannst.

Öffne mit ALT+F11 den VBA Editor.

Füge ein neues Modul ein, in das Du den folgenden Code einfügst:

Public Function IstPrim(Zahl) As Boolean
  IstPrim = True
  If Zahl = 1 Or Zahl = 2 Then
    IstPrim = True
    Exit Function
  End If

  If Zahl Mod 2 = 0 Then
        IstPrim = False
        Exit Function
  End If

  Teiler = 3
  Haelfte = Int(Zahl / 2)
  While Teiler <= Haelfte
        If Zahl Mod Teiler = 0 Then
            IstPrim = False
            Exit Function
        End If
        Teiler = Teiler + 2
  Wend
End Function

Jetzt kannst Du in Deinem Excel Arbeitsblatt die neue Funktion =IstPrim() einsetzen, die Wahr bzw. Falsch als Ergebnis zurückliefert. Als Argument gibst Du der Funktion die Zahl oder einen Bezug auf die Zelle, in der die zu testenden Zahl steht.

=IstPrim(B9) prüft z.B., ob die Zahl 65 in Zelle B9 eine Primzahl ist.

Die Funktion ist weitestgehend "nackt", hat also keine eigene Fehlerüberprüfung.

Versuche doch mal herauszufinden, wie die Funktion "funktioniert".

Gruß

Hannes

...zur Antwort

Hi,

Das geht zum Beispiel so, wobei nicht getestet wird, ob gerade mehrere Zellen ausgewählt wurden. Könnte man aber auch noch machen.

Sub Test()
Select Case ActiveCell.Address
    Case "$B$2", "$C$6", "$D$10"
        ActiveCell.Value = 5
    Case Else
        MsgBox("Das Argument (5) ist nicht mit der aktuellen Zelle kompatibel.")  
End Select
End Sub

Achtung: Die 5 nicht in Anführungszeichen! Sonst müsste man den String anders zusammensetzen.

Klappt es?

Hannes

...zur Antwort

Hi,

Ein Arduino ist als Mikrocontroller nicht wirklich erste Wahl für so eine Aufgabe. Mit Excel VBA wäre das wesentlich leichter. Aber es geht. Ich habe das so hinbekommen, wobei es bestimmt elegantere Lösungen gibt:

void setup() {

    char *Schueler[19];
    Serial.begin(115200);
    Schueler[0] = "Anton";
    Schueler[1] = "Bert";
    Schueler[2] = "Claus";
    Schueler[3] = "Dagmar";
    Schueler[4] = "Emma";
    Schueler[5] = "Fritz";
    Schueler[6] = "Gabi";
    Schueler[7] = "Hans";
    Schueler[8] = "Inge";
    Schueler[9] = "Jürgen";
    Schueler[10] = "Klaudia";
    Schueler[11] = "Luise";
    Schueler[12] = "Malte";
    Schueler[13] = "Nina";
    Schueler[14] = "Otto";
    Schueler[15] = "Petra";
    Schueler[16] = "Quentin";
    Schueler[17] = "Roland";
    Schueler[18] = "Sabine";


    Serial.println("Hier kommt der neue Tafeldienstplan");
    randomSeed(analogRead(0));
    int Woche = 1;
    for (int i=18; i>=0; i=i-1){
        int NTD = random(0, i+1);  //NTD steht für NächsterTafelDienst. Zunächst Zufallszahl 0 - 18, dann 0 - 17, wenn der erste Name gezogen und aus der Liste gelöscht wurde.
        Serial.print("Woche ");
        Serial.print (Woche);
        Serial.print(": ");
        Serial.println(Schueler[NTD]);

        // Die folgenden Elemente um eine Stelle vorrücken. 
        // Damit werden zum Beispiel aus 19 Namen 18 und der bereits gezogene Name wird gelöscht. 
        for (int j=NTD+1; j<=i; j=j+1){
          Schueler[j-1] = Schueler[j];
          }
        Woche++;
    }
}

void loop() {
// Hier passiert nichts mehr. Der Code soll ja nur einmal ausgeführt werden.
// Daher alles im Setup.
}

Viel Spaß damit. Ich würde mich über Feedback freuen.

Gruß

Hannes

...zur Antwort

Hi,

Ich habe die Frage so verstanden, dass Du wissen willst, was passiert, wenn man statt eines 3s Akkus einen 2s Akku verwendet.

Der Motor wird erheblich weniger Leistung haben. Am Beispiel eines Flugmodells eine Abschätzung, die natürlich viele Abweichungen von der idealen Situation vernachlässigt: Die Drehzahl des Propellers ist linear proportional zur Spannung. Halbierung der Spannung = Halbierung der Drehzahl.

Wenn Du bei 3s eine Drehzahl von 9000 U/min hast, wirst Du bei 2s etwa 6000 U/min erreichen. Ein Drittel weniger.

Die mechanische Leistung geht aber mit der dritten Potenz. Eine Verdoppelung der Drehzahl bewirkt eine Erhöhung der Leistung um den Faktor 8!

Die Verringerung der Drehzahl um ein Drittel bewirkt eine Absenkung der Leistung um gute 70%. Ob die verblebenden 30% für Deine Anwendung reichen, musst Du selber überlegen.

Hat Dir das geholfen? Freue mich auf Feedback?

Gruß

Hannes

...zur Antwort

Hi,

ich würde dieselben X-Werte nehmen, deren Wurzel berechnen und den Funktionsgraphen mit einer zweiten Y-Achse hinzufügen, die Du unabhängig skalieren kannst.

Oder Du multiplizierst die Wurzeln gleich mit einem geeigneten Skalierungsfaktor (ca. 6,5 in diesem Beispiel) und nutzt das vorhandene Koordinatensystem.

Klappt es?

Gruß

Hannes

...zur Antwort

Hallo zusammen

OK, also noch ein Versuch.

In dieser Version wird wunschgemäß jeweils "nur" zwischen den benachbarten Stützstellen interpoliert. Ich habe hier den Ansatz von Iamiam zur Berechnung der Nachbarwerte übernommen, aber auf alle Spalten erweitert. Egal, in welcher Spalte ein neuer Wert eingegeben wird, die Nachbarwerte werden für alle Spalten berechnet. 

Außerdem habe ich die Flexibilität eingebaut, im Bereich J2:Q2 einen beliebigen Wert in einer der 8 Spalten vorzugeben. Alle anderen Werte werden berechnet und in J6-Q6 ausgegeben. 

J4:Q5 sind Hilfsberechnungen. Hier werden die benachbarten Stützstellen berechnet. Das hätte man in die Formeln zur Berechnung der neuen Werte einfügen können, aber das wäre unleserlich geworden. Ist so schon grenzwertig.

Ein Schmankerl habe ich noch eingebaut: Es ist egal, wie lang die Liste im Bereich A:H ist. Die Länge wird automatisch ermittelt und die Formeln passen sich an. Alle Adressen des Datenbereichs werden auf den Datenstart in Zelle A2 bezogen.

Um diese Flexibilität zu ermöglichen, habe ich die Auswertung neben die Datentabelle verschoben. Natürlich muss man jetzt ein bisschen aufpassen, dass man nicht versehentlich die Formelbereiche überschreibt, aber das versteht sich ja von selbst.

Das File gibt's hier: http://www.filedropper.com/lineareregressionber8spaltenv2

Gruß

Hannes

...zur Antwort

Hi,

Ich habe mal ein kleines Makro geschrieben, das die Aufgabe lösen sollte. 

Das Makro muss in die Datei, in der die zu sortierenden Spalten stehen. Und die Tabelle mit den Werten muss die aktive (angezeigte) Tabelle sein, wenn Du das Makro startest. Wie Du es in die Datei bekommst und ausführst, weißt Du? 

Würde mich über Feedback freuen.

Viel Erfolg 

Hannes

Sub SpaltenUnabhaengigSortieren()
'
' Makro1 Spalten sortieren
'

Application.ScreenUpdating = False

LetzteSpalte = Cells(1, 10000).End(xlToLeft).Column

ErsteZeile = 2

For Spalte = 1 To LetzteSpalte
LetzteZeile = Cells(65536, Spalte).End(xlUp).Row

ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add Key:=Range(Cells(ErsteZeile, Spalte), Cells(LetzteZeile, Spalte)), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

With ActiveSheet.Sort

.SetRange Range(Cells(ErsteZeile, Spalte), Cells(LetzteZeile, Spalte))
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Next
Application.ScreenUpdating = True

End Sub
...zur Antwort
Weitere Inhalte können nur Nutzer sehen, die bei uns eingeloggt sind.