2016-04-14 43 views
0

私は単純なテスト式= SUMIF(D8:D18,2、E8:E18)のセルC13を持っています。 D8-> D18 2 2を保持し、D8:D18の値はハードコードされ、他の式からは取り出されません。 E8-> E18の範囲はすべて1です。 excelでは正しい値は2です。しかし、次の単純なコードでPHPExcelを呼び出すと、PHPExcel SUMIFが誤った/計算されていない式を返します

$objReader = PHPExcel_IOFactory::createReader($inputFileType); 
PHPExcel_Calculation::getInstance($objPHPExcel)->clearCalculationCache(); 
$objReader = $objPHPExcel->setActiveSheetIndexByName("TestSumIf"); 
$value = $objPHPExcel->getActiveSheet()->getCell('C13')->getCalculatedValue(); 

= 0

式の値は= SUMIFである私は$値を取得する(D8:D18,2、E8:E18)

期待値は0

パーサスタックであります: - ([タイプ] =>セル参照[値] => D18 [参照] => D8)[1] => [型] =>バイナリ演算子[値] =>:[参照] =>)[3] =>配列([型] =>値[値] => D18) > 2 [参照] =>)[4] =セル参照[値] => E8 [参照] => E8)[5] =>配列([型] =>セル参照[値] => E18 [参照] => E18) SUMIF()のオペランド数[] =>配列([型] =>バイナリ演算子[値] =>:[参照] =>)[7] 3 [参照] =>)[8] =>アレイ([タイプ] =>関数[値] => SUMIF([参照] =>))

計算値が0

評価ログである。

これはなぜ起こっているのかについての洞察があります。私はSUMIFとの間違いはないはずだが、SUMIROだけでSUMIRODUCTとして書き直すことができると書いているが、私のケースではSUMIFが原因でエラーが発生している。

答えて

0

これは誰にとっても問題が発生した場合です。私が個人的にしたことは、MathTrig.phpのSUMIF関数を次のように変更したことです。私の場合は、私の$配列と$ sum_arrayで '---'の値を除外したいと思います。値が$ checkVarsの値と等しい場合は、新しい配列$ ar countも数えます。 ifステートメントを独自の仕様に変更します。

public static function SUMIF($array,$criteria,$sum_array) 
{ 
$array = PHPExcel_Calculation_Functions::flattenArray($array); 
$sum_array = PHPExcel_Calculation_Functions::flattenArray($sum_array); 
$arraySize = sizeof($array); 
$arraySizeCount = 0; 
$checkVars = array(18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75); 
    for($i = 0; $i < $arraySize;$i++) 
    { 
     if($array[$i] === '---') 
     { 
      unset($array[$i]); 
      unset($sum_array[$i]); 
     } 
     else if(in_array($array[$i], $checkVars)) 
     { 
      $arraySizeCount++; 
     } 
    } 
if(is_array($array) && is_array($sum_array) && trim($criteria)!="") 
{ 
    $result = 0 ; 
     for($i=0;$i<$arraySizeCount;$i++) 
     { 
      if(preg_match("/^</",$criteria)) 
      { 
       $value = preg_replace("/^</","",$criteria); 
       $result += $array[$i] < $value ? $sum_array[$i]:0; 
      } 
      elseif(preg_match("/^>/",$criteria)) 
      { 
       $value = preg_replace("/^>/","",$criteria); 
       $result += $array[$i] > $value ? $sum_array[$i]:0; 
      } 
      else 
      { 
       $value = $criteria; 
       $result += $array[$i] == $value ? $sum_array[$i]:0; 
       echo $result; 
      } 
     } 
    return $result ? $result:0; 
} 
} 

これは完全に機能します。もし誰かがこれをより良く書くという意味を持っているなら、私に知らせてください。

関連する問題