|
いつもお世話になっております。 下記のようなのもで、機種別最小値を出したいのですが、途方に暮れてます。 XLSなので、"=MIN.."で埋め込めばよいのか、そうだと機種が増えた時、書き直さないといけませんし、 ご教授いただけませんでしょうか?
dim 機種[15],梱包[15],p=0,仕掛[15] 検索 = fopen("ハウス梱包.csv") for i = 2 to fget(検索, F_LINECOUNT) IFB fget(検索,i,7) = "T" THEN 機種[p]=fget(検索,i,1) 梱包[p]=fget(検索,i,2) p=p+1 endif next fclose(検索)
csv = fopen("Y:\zai.csv") Excel = XLOPEN("C:\在庫状況.xls") XLACTIVATE(Excel, "専用梱包") Ex = GETACTIVEOLEOBJ("Excel.Application")
for p = 0 to length(梱包)-1 XLSETDATA(Excel, 機種[p], 1, p+2) XLSETDATA(Excel, 梱包[p], 2, p+2) 仕掛[P] = XLGETDATA( Excel,9,p+2) //仕掛かり 5行目 next
ifb XLGETDATA( Excel,4,1 ) <> fget( csv,2,35) then Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert XLSETDATA(Excel, fget(csv,2,35), 4, 1) //更新日 XLSETDATA(Excel, "注残", 5, 1) XLSETDATA(Excel, "出荷", 6, 1) XLSETDATA(Excel, "在庫−注残", 7, 1) XLSETDATA(Excel, "前日生産", 8, 1) XLSETDATA(Excel, "仕掛−前日生産", 9, 1) XLSETDATA(Excel, "受注可能数", 10, 1) for p = 0 to length(梱包)-1 for i = 2 to fget(csv, F_LINECOUNT) IFB fget(csv,i,2) = 梱包[p] THEN DIM 在庫 = fget(csv,i, 5) DIM 注残 = fget(csv,i, 12) DIM 出荷 = fget(csv,i, 7) DIM 前日生産 = fget(csv,i, 3) XLSETDATA(Excel, 在庫, 4, p+2) XLSETDATA(Excel, 注残, 5, p+2) XLSETDATA(Excel, 出荷, 6, p+2) XLSETDATA(Excel, 在庫 - 注残, 7, p+2) XLSETDATA(Excel, 前日生産, 8, p+2) XLSETDATA(Excel, 仕掛[P] - 前日生産, 9, p+2) XLSETDATA(Excel, 在庫 - 注残 + 仕掛[P] - 前日生産, 10, p+2) break endif next next endif fclose(csv) XLCLOSE(Excel)
在庫状況.xls 機種,T177,T177,T199,T199, 梱包,17A,TH6,19A,TH6 更新日,扉,部品箱,扉,部品箱 160909,25,23,23,23, 注残,8,15,7,15, 出荷,1,2,1,2, 在庫−注残,17,8,16,8, 前日生産,0,0,0,0, 仕掛−前日生産,60,90,33,90, 梱包別受注可能数,77,98,49,98, 機種別受注可能数,77,77,49,49,←機種別最小値を出したい
|
No.2856 2016/09/11(Sun) 13:57:50
|
☆ Re: 機種別最小値 / Nagatani |
|
|
>>機種別最小値を出したい
//スクリプトはここから PUBLIC HASHTBL 機種 // パブリック、大・小文字区別しない、キーは書込み順 HASHTBL 機種名 = HASH_CASECARE or HASH_SORT // 大・小文字区別、キーはソート dim 機種名[15],可能数[15]
Excel = XLOPEN("C:\Users\Nagatani\Documents\在庫状況.xls") Ex = GETACTIVEOLEOBJ("Excel.Application")
//列数を数える LonLast = 0 WHILE EX.ActiveSheet.CELLS(11,LonLast+2).VALUE <> "" LonLast = LonLast + 1 WEND LonLast = LonLast - 1
//配列に記憶 FOR LonI1 = 0 TO LonLast - 1 IF 機種[ Ex.ActiveSheet.CELLS(1,LonI1 + 2).VALUE , HASH_EXISTS ] = False THEN 機種[ Ex.ActiveSheet.CELLS(1,LonI1 + 2).VALUE ]=Ex.ActiveSheet.CELLS(1,LonI1 + 2).VALUE //機種名 ENDIF NEXT
//機種名に登録がなければ登録・あれば比較して可能数を変更 LonLast2 = LENGTH(機種) - 1 FOR LonI1 = 0 TO LonLast2 FOR LonI2 = 0 TO LonLast IF 機種[LonI1,HASH_VAL] = Ex.ActiveSheet.CELLS(1,LonI2 + 2).VALUE THEN 機種名[LonI1] = Ex.ActiveSheet.CELLS( 1,LonI2 + 2).VALUE //機種名 IF (可能数[LonI1] = "" OR 可能数[LonI1] > Ex.ActiveSheet.CELLS(11,LonI2 + 2).VALUE) THEN 可能数[LonI1] = Ex.ActiveSheet.CELLS(11,LonI2 + 2).VALUE //可能数 ENDIF ENDIF NEXT NEXT //表示 FOR LonI1 = 0 TO LonLast2 PRINT "機種名 " + 機種名[LonI1] + " : " + 可能数[LonI1] NEXT //スクリプトここまで
>>機種が増えた時、書き直さない ?@エクセルシートの上(場合によって左側)に必要な最小値を表示させて固定する。 ?A機種を追加する場合は下(場合によっては右側)へ挿入 こうすれば上記スクリプトも必要ないような?
「ハウス梱包.csv」と「ZAI.CSV」がわからなかったので・・・はずしてたらごめんなさい!
|
No.2858 2016/09/11(Sun) 19:10:13
|
|
☆ Re: 機種別最小値 / SEN |
|
|
ありがとうございます。 なんか、自分にはちょっと難しそうです。 計算式を貼り付ける以外に想像していたのは、CALCARRAYでして、 下記のも一つ機種が終わると止まってしまいますし、 一つ目のセルには最小値が入りません(なければないでそれも支障はないのですが)。 全然ではありますが、簡単なのはありませんでしょうか? 恐縮です。
dim 梱包可能数[10]
Excel = XLOPEN("C:\在庫状況.xls") XLACTIVATE(Excel, "専用梱包") Ex = GETACTIVEOLEOBJ("Excel.Application") i = 2 REPEAT 左機種 = XLGETDATA(Excel,1,i) 機種 = XLGETDATA(Excel,1,i+1) 梱包可能数[i]= XLGETDATA(Excel,10,i) i=i+1 UNTIL 左機種<>機種 XLSETDATA(Excel,CALCARRAY(梱包可能数,CALC_min),11, i-1) XLCLOSE(Excel)
|
No.2859 2016/09/11(Sun) 22:36:12
|
|
☆ Re: 機種別最小値 / Liners |
|
|
// 簡単 = 最小行数の意味なら… 変数を抑え、IF文を廃止して既出の手法に配慮したが…いかがでしょうか?
Ex = GETACTIVEOLEOBJ("Excel.Application") hashtbl h n = Ex.Range("A1").End(-4161).Column // xlToRight = -4161 for i = 2 to n h[EX.ActiveSheet.CELLS(1, i).value] = h[EX.ActiveSheet.CELLS(1, i).value] + "," + EX.ActiveSheet.CELLS(10, i).value next for i = 2 to n EX.ActiveSheet.CELLS(11, i).value = CALCARRAY(Split(h[EX.ActiveSheet.CELLS(1, i).value], ",", 1, 1),CALC_min) next
|
No.2860 2016/09/12(Mon) 03:50:57
|
|
☆ Re: 機種別最小値 / 森 |
|
No.2861 2016/09/12(Mon) 07:53:19
|
|
☆ Re: 機種別最小値 / SEN |
|
|
ありがとうございます。 これだと思って組み込んで動かしまして家のパソコンではうまく動くのですが、 しかし、会社のパソコンでは最後のエクセルへの書き込みのところでなにも転記されません。 家のはEXCEL2016、EXCEL2010です。 こんな事ありますでしょうか? エクセルへの書き込みのところは下記のような感じに書き換えさせていただきました。 家のパソコンではうまくいくので、問題はないと思いますが、あと一歩で悔しい思いです。 何をお伝えしたら、わかりますでしょうか?
XLSETDATA(Excel,CALCARRAY(Split(h[機種[i-1]],",",1,1),CALC_min),11,i+1)
|
No.2875 2016/09/16(Fri) 23:13:08
|
|
☆ Re: 機種別最小値 / Liners |
|
|
>こんな事ありますでしょうか? あり得ますが、ほとんどの場合スクリプトかデータに問題があります。
>何をお伝えしたら、わかりますでしょうか? まず改変なしの動作結果です。ここで問題なら根本的原因です。 次に改変したもので、単独で動作する最小限のスクリプトと使用データ。
>XLSETDATA(Excel,CALCARRAY(Split(h[機種[i-1]],",",1,1),CALC_min),11,i+1) さすがに、これだけでは…
ただ一瞬で不自然なのは分かります。機種[i-1]の部分で通常このようには書きません。 この部分は表示されている列の機種名で、順不同かつ重複・不定数なので、通常配列には入れずに、その都度セルから読み取ります。 少なくともこんな風に書くでしょう。
XLSETDATA(Excel,CALCARRAY(Split(h[XLGETDATA(Excel,1,i+1)],",",1,1),CALC_min),11,i+1)
|
No.2882 2016/09/17(Sat) 22:50:51
|
|
☆ Re: 機種別最小値 / SEN |
|
|
何から何まで済みません。 下記のものが全部です。 昨日、会社のパソコンで調べた限りでは、CALCARRAYの最低値がうまく取れないみたいです。 よろしくお願いします。
dim 機種[100],梱包[100],p=0,仕掛[100],梱包可能数[100] hashtbl h 検索 = fopen("C:\ハウス梱包.csv") for i = 2 to fget(検索, F_LINECOUNT) IFB fget(検索,i,7) = "TH" THEN 機種[p]=fget(検索,i,1) 梱包[p]=fget(検索,i,2) print p+" "+機種[p] p=p+1 endif next fclose(検索)
dim 列数 = p
csv = fopen("C:\zai.csv") Excel = XLOPEN("C:\在庫状況.xls") XLACTIVATE(Excel,"専用梱包") Ex = GETACTIVEOLEOBJ("Excel.Application")
for p = 0 to 列数 XLSETDATA(Excel, 機種[p], 1, p+2) XLSETDATA(Excel, 梱包[p], 2, p+2) 仕掛[P] = XLGETDATA( Excel,9,p+2) next
ifb XLGETDATA( Excel,4,1 ) <> fget( csv,2,35) then Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert Ex.Rows(4).Insert XLSETDATA(Excel, fget(csv,2,35), 4, 1) //更新日 XLSETDATA(Excel, "注残", 5, 1) XLSETDATA(Excel, "出荷", 6, 1) XLSETDATA(Excel, "在庫−注残", 7, 1) XLSETDATA(Excel, "前日生産", 8, 1) XLSETDATA(Excel, "仕掛−前日生産", 9, 1) XLSETDATA(Excel, "受注可能数(梱包)", 10, 1) XLSETDATA(Excel, "受注可能数(機種)", 11, 1) for p = 0 to 列数 for i = 2 to fget(csv, F_LINECOUNT) IFB fget(csv,i,2) = 梱包[p] THEN DIM 在庫 = fget(csv,i, 5) DIM 注残 = fget(csv,i, 12) DIM 出荷 = fget(csv,i, 7) DIM 前日生産 = fget(csv,i, 3) XLSETDATA(Excel, 在庫, 4, p+2) XLSETDATA(Excel, 注残, 5, p+2) XLSETDATA(Excel, 出荷, 6, p+2) XLSETDATA(Excel, 在庫 - 注残, 7, p+2) XLSETDATA(Excel, 前日生産, 8, p+2) XLSETDATA(Excel, 仕掛[P] - 前日生産, 9, p+2) XLSETDATA(Excel, 在庫 - 注残 + 仕掛[P] - 前日生産, 10, p+2) 梱包可能数[P] = 在庫 - 注残 + 仕掛[P] - 前日生産 h[機種[P]] = h[機種[P]] + "," + 梱包可能数[P] break endif next next for i = 1 to 列数 //XLSETDATA(Excel,CALCARRAY(Split(h[機種[i-1]],",",1,1),CALC_min),11,i+1) XLSETDATA(Excel,CALCARRAY(Split(h[XLGETDATA(Excel,1,i+1)],",",1,1),CALC_min),11,i+1) if 機種[i-1] = "" then break next endif XLCLOSE(Excel) fclose(csv)
ハウス梱包.csv 間口/機種,梱包,数,掛率,企業体,マイナス,梱包在庫抽出 177A,17A4,1,,,1,TH 177A,10-6,1,,,1,TH 199A,19A4,1,,,1,TH 199A,10-6,1,,,1,TH
a1,梱包番号,a2,a3,在庫数,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41 1,10-6,0,0,61,0,0,0,0,120,105,45,46,2,206,563,201,120,0,0,0,0,0,0,0,0,0,570,150,210,0,0,0,0,160716,0,0,0,0,0,0,0,0 1,17A4,0,0,110,0,0,0,0,146,86,29,50,2,206,345,126,84,0,0,0,0,0,0,0,0,0,306,151,148,0,0,0,0,160716,0,0,0,0,0,0,0,16 1,19A4,0,0,41,0,0,0,0,55,52,16,38,2,206,220,75,36,0,0,0,0,0,0,0,0,0,190,122,58,0,0,0,0,160716,0,0,0,0,0,0,0,16,
在庫状況.xls 機種 177A 177A 199A 199A 梱包 17A4 10-6 19A4 10-6 25 23 23 23 注残 8 15 7 15 出荷 1 2 1 2 在庫−注残 17 8 16 8 前日生産 0 0 0 0 仕掛−前日生産 60 90 33 90 受注可能数 98 15 49 98 15 15 49 49
|
No.2884 2016/09/18(Sun) 10:51:23
|
|
☆ Re: 機種別最小値 / 俄プログラマー |
|
|
>CALCARRAYの最低値がうまく取れないみたいです。
Linersさんが書かれている事を試しましたか? 抜粋します 「ほとんどの場合スクリプトかデータに問題があります。」 「単独で動作する最小限のスクリプトと使用データ」
山を見てダメなら木を見る 木を見てダメなら葉っぱを見る プログラムのバグ取りはこんな風です。
「CALCARRAYの最低値がうまく取れない」のであれば 取得先のデータが正しくないからです。 そのデータが正しい形になっていますか? 目で見えるように画面に表示してみてください。 そして確認です。 思っているデータが例えば 「10 40 35 5 75」 の筈なのに 「」 なんて事も良くありますよ。 必要であればCALCARRAYに特化した動作確認用のサンプルプログラムを作ってみましょう。 それで動作がしっかり出来ているかの確認です。
|
No.2885 2016/09/18(Sun) 11:43:48
|
|
☆ Re: 機種別最小値 / Liners |
|
|
結論から言うと動作しません。原因はデータの不備です。 問題個所は ifb XLGETDATA( Excel,4,1 ) <> fget( csv,2,35) then で在庫状況.xlsの該当部分は空白です。
またXLACTIVATE(Excel,"専用梱包")も不明ですし、在庫状況.xlsの内容もこのデータで作成されたものではありません。 全体にデータの不備が目立ちます。再チェックしてください。
スクリプトも正常動作する部分は除外して、命題に沿った必要最低限として下さい。 原因不明なので、全体を見てほしいと思う気持ちは理解できますが、逆効果です。
該当個所関連をコメントアウトすると、正常動作します。
受注可能数(梱包) 141 106 58 106 受注可能数(機種) 106 106 58 58
|
No.2890 2016/09/18(Sun) 13:56:29
|
|