2016-06-29 8 views
0

Ich bin auf der Suche nach einer Lösung für dieses Problem: Ich habe eine Jquery-basierte Tabelle mit Berechnungsfunktionen erstellt und es funktioniert gut. Jetzt möchte ich ein bestimmtes Formular in die nächsten Zeilen kopieren und die Zellbezüge in dieser Formel aktualisieren. Beispiel: Formel in row1 = if (und (A1 = 0; B1 = 0); 0; A1 + B1) Die Kopie dieser Formel in Zeile2 sollte sein: if (und (A2 = 0; B2 = 0); 0; A2 + B2) Das einfache Ersetzen der Zahlen führt zu "if (und (A2 = 2; B2 = 2); 2; A2 + B2)" und die kopierte Formel stimmt nicht. Hat jemand eine Idee? Sehr Dank, Bernd von GermayÄndern Cell-Reference in Excel-ähnliche Formula-String mit Javascript/jquery

Dies ist meine aktuelle Lösung:

 function createNewFormula() 
     { 
      var rowNew = $('#copyto option:selected').attr('value'); //the targetRow 
      var exp = /(?:\w[0-9]+)/g;         //searchPattern 
      var formula = $('#formula2').val();       //current formula 
      var arrMatches = formula.match(exp);      //array of Matches 
      var startIndexOf=0;           //startposition in current formula 
      $.each(arrMatches,function(key,val){ 
       var idx = formula.indexOf(val,startIndexOf); 
       //set new startPositon in current formula 
       startIndexOf = idx; 
       //replace the number in new Cell-Reference 
       var valNew = val.replace(/(?![A-Za-z])\d+/g,rowNew); 
       //replace part of current formula with new Cell-Reference 
       formula = formula.replace(formula.substring(idx,idx+val.length),valNew); 
      }); 

      //output to an input-element for test 
      $('#formulaNew').val(formula); 

     } 

Die zweite Idee:

 //create a new string-method replaceAll 
     String.prototype.replaceAll = function(find, replacewith) { 
      var currentformula = this; 
      return currentformula.split(find).join(replacewith); 
     };    
     //create a function to check if a substring in formula is a letter 
     //like A,B,C.... 
     function isLetter(formulapos) { 
      return formulapos.length === 1 && formulapos.match(/[A-Za-z]/i); 
     } 
     //and use this in the following to replace the cell-references 
     function createNewFormula() 
     { 
      var rowNew = $('#copyto option:selected').attr('value'); //the targetRow     
      var exp = /\d+/g;           //match all munbers 
      var formula = $('#formula2').val();       //current formula to copy 
      var arrMatches = formula.match(exp);      //array of matches 
      var startIndexOf=0;           //startposition for indexOf-method 
      $.each(arrMatches,function(key,val) 
      { 
       var idx = formula.indexOf(val,startIndexOf);   //set position 
       var fsubstr = formula.charAt(idx-1);     //prev. Pos. 
       startIndexOf=idx; 
       var isletter = isLetter(fsubstr);      //is letter at prev. Pos. 
       if(isLetter(fsubstr)!==null) 
       { 
        //insert a placeholder on the numbers in current formula 
        formula = formula.replace(formula.substring(idx,idx+val.length),'#'); 
       } 
      }); 
      //replace all placeholders with the new row-Number 
      formula = formula.replaceAll('#',rowNew); 
      $('#formulaNew').val(formula); 

     } 

Antwort

0

können Sie ein wenig ändern, die Regex nur die Zellnamen zu ändern, Beispiel:

var valNew = val.replace(/([A-Z])\d+/g,"$1"+rowNew); 

Natürlich wird dies nicht in einigen Fällen helfen, wo Sie brauche eine Zelle, um sich nie zu ändern, aber in diesem Fall sollte es funktionieren.

+0

Vielen Dank für Ihre Antwort es mir geholfen, die endgültige Lösung zu realisieren, aber ich hatte Probleme mit, dass auf längere Formeln mit gutem Beispiel dieses: if (und (A1 = 0; b1 = 0); if (A1

+0

Ja, wenn Zellen geändert werden müssen und andere, die nicht geändert werden sollen, ist es ziemlich schwierig, dies mit dem aktuellen Code zu tun. Es wäre hilfreich, wenn die Formel eine andere Schreibweise für Zellen hätte, die sich ändern können, und für Zellen, die nicht geändert werden können. – Naryl