Buchstaben weiterzählen für Excel-Spalten.



  • Morgen zusammen mein Problem dürfte eigentlich nicht schwer sein doch finde ich den Fehler in unten stehendem Source nicht!
    Es geht um folgendes:
    Ich schreibe spaltenweise Daten in ein Excel-sheet. Da ich das in einer FOR Schleife mache muss ich die Spalte eins weiter zählen. (Spalten in Excel A , B , C , ... , Z , AA , AB ,...). Das wollte ich eben mit dem Source machen doch wenn mein m_sStartingCell (LOL strg + space klappt hier nicht! 🙄 😃 ) B9 ist, dann geht er mir dennoch nicht in die if ==9 sondern in die else. und dann fleigt er natürlich auf die Schnauze, weil m_sStartingCell an der Stelle 2 nicht existiert. Aber warum geht er nicht in die if == 9?????
    Bitte schaut euch das mal an
    Vielen Dank schon im Voraus

    //die Splate eins weiterzählen
    		if(m_sStartingCell[0] == 'Z') //Bei Spalte Z geht es mit AA weiter
    			m_sStartingCell = "AA9";
    		else
    		{
    			if(m_sStartingCell[1] == 9) //Wenn ein-buchstabige Spalte (9 = Startzeile)
    			{
    				char cSpalte[1];
    				cSpalte[0] = m_sStartingCell[0];
    				cSpalte[0]++;
    				m_sStartingCell = cSpalte[0] + m_sStartingCell[1];
    			}
    			else
    			{//wenn zwei-buchstabige Spalte
    				char cSpalte[1];
    				cSpalte[0] = m_sStartingCell[1];
    				cSpalte[0]++;
    				m_sStartingCell = m_sStartingCell[1] + cSpalte[0] + m_sStartingCell[2];
    			}
    		}
    


  • Arg, DEN Fehler hab ich jetzt aber auch ein Weilchen gesucht... 🙄

    Schau mal die if an:

    if(m_sStartingCell[0] == 'Z')
    

    Was vergleichst du mit was?

    und jetzt die:

    if(m_sStartingCell[1] == 9)
    

    Was vergleichst du mit was?

    Naaaa? 😃



  • Oh man ich Blinde! Ja ich sollte ein char 9 nicht mit einem int 9 vergleichen! sollte schon '9' schreiben. jetzt geht es!

    Vielen lieben Dank 😃



  • Hm die If Abfrage tut tatsächlich aber ich war wieder zu voreilig, in meinem m_sStartingCell steht jetzt nur | drin warum? kann ich nem String nicht einfach so wie oben die character eintragen? 😞 😕



  • Eine Kleinigkeit iritiert mich:

    char cSpalte[1];
    

    Das ist doch das Selbe wie

    char cSpalte;
    

    oder? 😕

    Und sag doch bitte mal, was m_sStartingCell für ein Typ ist.

    Und ich glaube, in der Zeile hast du einen Indexfehler:

    m_sStartingCell = m_sStartingCell[1] + cSpalte[0] + m_sStartingCell[2];
    


  • estartu_de schrieb:

    Eine Kleinigkeit iritiert mich:

    char cSpalte[1];
    

    Das ist doch das Selbe wie

    char cSpalte;
    

    oder? 😕

    Joa nur dass ich die Größe festlege. Und da ich eh nicht mehr brauch ist es so IMHO schon sinnig zu machen.

    estartu_de schrieb:

    Und sag doch bitte mal, was m_sStartingCell für ein Typ ist.

    ist ein CString

    estartu_de schrieb:

    Und ich glaube, in der Zeile hast du einen Indexfehler:

    m_sStartingCell = m_sStartingCell[1] + cSpalte[0] + m_sStartingCell[2];
    

    Wow stimmt das erste StartinCell muss index 0 sein! Danke. 😃 Das hat aber leider nichts mit dem Fehler zu tun. 😞



  • Abgesehen davon, dass du bei dem Schritt AZ->BA ein Problem haben dürftest mit dem jetzigen Code, sehe ich gerade kein Problem mehr.

    Verstehe ich das richtig?
    Es sollte AA9 drinstehen und es steht aber nur ein ungüliges Zeichen drin?
    Welches?
    Geht die Funktion grundsätzlich schief? Oder nur in bestimmten Fällen?



  • estartu_de schrieb:

    Abgesehen davon, dass du bei dem Schritt AZ->BA ein Problem haben dürftest mit dem jetzigen Code, sehe ich gerade kein Problem mehr.

    😕 Wieso? Ich schreibe A dann das hochgezählte und dann die 9 die ja an [2] steht

    estartu_de schrieb:

    Verstehe ich das richtig?
    Es sollte AA9 drinstehen und es steht aber nur ein ungüliges Zeichen drin?
    Welches?
    Geht die Funktion grundsätzlich schief? Oder nur in bestimmten Fällen?

    Also ich geh rein vor der For schleife mache ich m_sStartingCell = "B9";
    jetzt geh ich in die Schleife und wenn ich dann an die im ersten Post gezeigte Stelle komme, sollte eigentlich C9 drin stehen, es steht aber nur "|" drin. Somit kann ich beim nächsten einfügen nicht viel anfangen, da er da was im format BuchstabeZahl bzw Buchstabe Buchstabe Zahl erwartet.
    Ist es so nun klarer??



  • Ich habe das mal getestet und umgebastelt.

    if(m_sStartingCell[1] == '9') //Wenn ein-buchstabige Spalte (9 = Startzeile)
    		{
    			m_sStartingCell.SetAt(0, m_sStartingCell[0]+1);
    		}
    

    Damit gehts. 🙂

    Aber ich bin weiterhin der Meinung, dass der Code den Sprung von AZ9 auf BA9 nicht schafft. Test it. 😉



  • estartu_de schrieb:

    Ich habe das mal getestet und umgebastelt.

    if(m_sStartingCell[1] == '9') //Wenn ein-buchstabige Spalte (9 = Startzeile)
    		{
    			m_sStartingCell.SetAt(0, m_sStartingCell[0]+1);
    		}
    

    Damit gehts. 🙂

    Aber ich bin weiterhin der Meinung, dass der Code den Sprung von AZ9 auf BA9 nicht schafft. Test it. 😉

    Joa cool so geht es! Der Sprung von AZ auf BA kann wie ich es hatte nicht klappen da geb ich dir recht. Ich bin aber leichtsinnig wie ich bin davon ausgegangen es wird schon niemand mehr als 52 Spalten eintragen! *gg* aber jetzt hab ich es so gemacht wie du es mir vorgeschalgen hast und es geht einwandfrei! 😃 😉 Und es sieht sogar schöner aus!

    //die Splate eins weiterzählen
    		if(m_sStartingCell[0] == 'Z') //Bei Spalte Z geht es mit AA weiter
    			m_sStartingCell = "AA9";
    		else
    		{
    			if(m_sStartingCell[1] == '9') //Wenn ein-buchstabige Spalte (9 = Startzeile) 
    			{ 
    				m_sStartingCell.SetAt(0, m_sStartingCell[0]+1); 
    			}
    			else
    			{//wenn zwei-buchstabige Spalte
    				m_sStartingCell.SetAt(1, m_sStartingCell[1]+1);
    			}
    		}
    

    Jetzt sollte es bis ZZ gehen und das macht Excel nicht mal!

    Vielen Dank bist heute wieder mal meine Retterin!! 😃 😉



  • Und du hast mir ein schönes Knobelspielchen vor die Füße geworfen. *schimpf* *zeter* 😉
    Jetzt musste ich das auch noch lösen... 🙄

    //Herausfinden, welches die letzte Stelle vor den Zahlen ist.
    	int nLen = m_sStartingCell.FindOneOf("0123456789") - 1;
    	if(m_sStartingCell.GetAt(nLen) == 'Z') //Bei Z geht es mit A weiter
    	{
    		m_sStartingCell.SetAt(nLen, 'A');
    		if (nLen == 0)
    		{ // bei einem Buchstaben den zweiten davorpacken
    			m_sStartingCell = 'A' + m_sStartingCell;
    		}
    		else
    		{ // den vorderen hochzählen
    			m_sStartingCell.SetAt(0, m_sStartingCell.GetAt(0)+1);
    		}
    	}
    	else
    	{
    		m_sStartingCell.SetAt(nLen, m_sStartingCell.GetAt(nLen)+1);
    	}
    

    Das funktioniert mit A9->B9, Z9->AA9, A10->B10, Z10->AA10 usw. 😃
    Nur für ZZ->AAA hab ich nix gemacht, das gibts ja eh nicht...

    So, jetzt mach ich aber mit meinem blöden Drucken hier weiter... *schnellverdrück*



  • Boa des hat mich jetzt mörder umgehauen!
    RESPEKT! Ich mein sowas monströs-perfektes hätte ich nicht mal unbedingt gebraucht, es wäre wahrscheinlich mit der "einfachen" Variante gegangen, aber deine Variante ist ja echt der Bringer!

    VIELEN VIELEN LIEBEN DANK!

    Bist echt ein riesen Schatz! 😃

    P.S.: In dem Post istfür dich noch ein kleines Easteregg versteckt, findest es??



  • Jupp, hab es. 😃

    Ich liebe solche Knobelspielchen halt. Die kommen nur leider viel zu selten im Alltag vor.



  • naja ich freu mich nicht so mit diesen Knobelspielchen, vor allem wenn sie mit so was nervigem wie dem scheiß Excel-Dreck zu tun haben! Alles was ich gestern gemacht hab konnte ich heute übern Jordan schicken! 😞
    Excel ist scheiße!

    Vielen lieben Dank!



  • hab das Knobelspiel noch erweitert! Er soll immer in die dritte Zeile ne min Formel schreiben in die 4. ne max Formel... immer beziehend auf die Spalte in der er ist. Hab es so gelöst:

    CString sStartzelle = "P3";
    	//Formeln von P - AN
    	for (int Spaltenanzahl = 0;Spaltenanzahl<=24 ;Spaltenanzahl++)
    	{
    		int nStelleZahl = sStartzelle.FindOneOf("0123456789");
    		CString sStartZeile = sStartzelle.GetAt(nStelleZahl);	
    		sStartZeile = sStartzelle.GetAt(nStelleZahl);
    
    		//Formel Min in Zeile 3
    		range = objSheet.GetRange(COleVariant(sStartzelle),COleVariant(sStartzelle));
    		Formel.Format("=Min(R[6]C:R[%d]C)",m_iNumRows-3);
    		range.SetFormulaR1C1(COleVariant(Formel));
    		//Den Zahlenwert eins hochzählen
    		sStartzelle.SetAt(nStelleZahl, sStartzelle.GetAt(nStelleZahl)+1);
    
    ....
    		//Formel median in Zeile 17
    		range = objSheet.GetRange(COleVariant(sStartzelle),COleVariant(sStartzelle));
    		Formel.Format("=MEDIAN(R[2]C:R[%d]C)",m_iNumRows-17);
    		range.SetFormulaR1C1(COleVariant(Formel));
    		//Den Zahlenwert eins hochzählen
    		sStartzelle.SetAt(nStelleZahl, sStartZeile[0]);
    
    		//Buchstaben hochzählen 
    	    int nLen = nStelleZahl-1; 
    	    if(sStartzelle.GetAt(nLen) == 'Z') //Bei Z geht es mit A weiter 
    	    { 
    	        sStartzelle.SetAt(nLen, 'A'); 
    	        if (nLen == 0) 
    	        { // bei einem Buchstaben den zweiten davorpacken 
    	            sStartzelle = 'A' + sStartzelle; 
    	        } 
    	        else 
    	        { // den vorderen hochzählen 
    	            sStartzelle.SetAt(0, sStartzelle.GetAt(0)+1); 
    	        } 
    	    } 
    	    else 
    	    { 
    	        sStartzelle.SetAt(nLen, sStartzelle.GetAt(nLen)+1); 
    	    }
    	}
    

    Puuuh geschafft! 😃


Anmelden zum Antworten