excelデータの数字をカウントするには?

解決


ぐれむ  2008-07-14 22:05:53  No: 31235

0000368934874300000

上記のような
左右を0で囲まれたexcelデータの
数字列の左側にある0の数をカウントしようと
下記のようにプログラムを作ったのですが上手くいきません。
初心者なので初歩的な内容かもしれませんが
出来ましたらアドバイスください。
宜しくお願いします

カウントしたい0の個数をnx1とし

  nx1:=0;

  for i:=1 to nx do begin
   if ExcelSheet.Cells[1,i].value <= 0 then
      nx1:=nx1+1;
 if ExcelSheet.Cells[1,i].value > 0 then;
end;


Mr.XRAY  2008-07-14 22:53:48  No: 31236

>0000368934874300000

これは一つセルの値のことですか?
でしたら,それは間違いなくうまくいかないでしょう.
Cell[1,i].Value はセルの値を取得するものです.
iの値を変化させているということは,違うセルの値を取得していることになって
しまいます.

以下は左側の'0'の数を数える関数の例です.
勘違いしないように言っておきますが,Sにセルの値を渡します.

function TForm1.ZeroCount(S: String): Integer;
var
    I, L: Integer;
begin
    L := Length(S);
    I := 1;
    while (I <= L) and (S[I] <= '0') do Inc(I);
    Result := I-1;
end;

がんばってください.


Mr.XRAY  2008-07-14 22:54:53  No: 31237

スミマセン.間違いです.
Iの初期値を0にしてください.


ぐれむ  2008-07-14 23:09:05  No: 31238

説明不足で申し訳ありません
これは1つのセルに1つの数字が入っているのです。

0,0,0,0,3,6,8,9,3,4,8,7,4,3,0,0,0,0,0

このような状態で左側の0の個数をカウントしたいのです。
上記の場合は4になります。

左から順番にセルの値を読み取って
値が0以下ならnx1の値に1を加えるといったように考えていたのですが。


D  2008-07-14 23:53:30  No: 31239

そのFor文に0以外があった場合にループ抜け出す手続きするだけじゃ?
Break や Exit 手続き参照


Mr.XRAY  2008-07-15 00:19:46  No: 31240

何故に
0000368934874300000  が
0,0,0,0,3,6,8,9,3,4,8,7,4,3,0,0,0,0,0
となってしまっているのかよくわかりませんが...
仕様変更ですか?
仕様変更は別料金となります(笑).
                                            
>そのFor文に0以外があった場合にループ抜け出す手続きするだけじゃ?

そういうことですね.なりゆきなのでコードを

0,0,0,0,3,6,8,9,3,4,8,7,4,3,0,0,0,0,0
0000368934874300000';

どちらでも動作すると思います.

function TForm1.ZeroCount(S: String): Integer;
var
    I, L: Integer;
begin
    L := Length(Trim(S));
    Result := 0;

    for i:=1 to L do begin
      if (S[I] <> '0') then break;
      if (S[I] = '0') then inc(Result);
    end;
end;


ぐれむ  2008-07-15 01:03:38  No: 31241

お二方ともアドバイスありがとうございました。
おかげで何とか解決しました。


Mr.XRAY  2008-07-15 05:57:08  No: 31242

>おかげで何とか解決しました。

どうやったのでしょう(笑).
先のコードの修正です.今見返したら...  あれっ!! です.

function TForm1.ZeroCount(S: String): Integer;
var
    I, L: Integer;
begin
    L := Length(Trim(S));
    Result := 0;

    for i:=1 to L do begin
      if (S[I] <> '0') and (S[I]<>',') then break;
      if (S[I] = '0') then inc(Result);
    end;
end;

用途によっては,以下でもいいかも知れません.

      if (S[I] > '0')  then break;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加