----------< PGソース開始 >---------- for k := 1 to 10 do begin // エラーがなくなるまでループ...時々10回になるが、エラー回避で次回まわしでOK try if 0 < FTickRetrys[i] then begin // リトライ...無条件に読込. bNewTick := True; end else begin // エクセル1行読込で変化があるか? TopNo := VarToInteger_(WorkSheets[Sheet].Range['N1'].Value); bNewTick:= (TopNo <> TickNo); end; // HighTicks := -1; SeriesNo := 0; bTickRetry:= False; bErr := False; if bNewTick then begin try // エクセル読込... =FTICK("%s", "0", "300", 行読込(Max=300). // <1> Lock WorkSheets[Sheet].Unprotect; WorkSheets[Sheet].Range['L1:R300'].Locked := True; WorkSheets[Sheet].Protect; // <2> 読込と検証 1Pass ExcelTick := WorkSheets[Sheet].Range['L1:R300'].Value; if VarIsArray(ExcelTick) and (VarArrayHighBound(ExcelTick, 2) = 7) then begin // 代入前に配列クリア. 2: 2次元目. TickThreads[i].ClearTicks; BottomGyo := 0; for j := VarArrayLowBound(ExcelTick, 1) to VarArrayHighBound(ExcelTick, 1) do with TickThreads[i].Ticks[j] do begin Dt := VarToDateTime( ExcelTick[j, 1]) + // 日付 VarToDateTime( ExcelTick[j, 2]); // 時刻. No := VarToInteger_( ExcelTick[j, 3]); // 約定通番. Ed := VarToCurrency_(ExcelTick[j, 4]); // 現在値. Dk := VarToInteger_( ExcelTick[j, 5]); // 出来高...TickのみInteger VWap := VarToCurrency_(ExcelTick[j, 6]); // VWAP. KKyo := VarToCurrency_(ExcelTick[j, 7] * 100); // 買付強度...[50 %]⇒[0.5]の数値. if (CdMode = cdmSihyo) and (StTim2 <= TimeOf(Dt)) then Day := Trunc(Dt) +1 // 翌日. else Day := Trunc(Dt); // 当日. bErr := False; // 新規行. if j = 1 then begin // VarArrayLowBound(ExcelTick, 1) SeriesNo := No; // TopNo. BottomGyo := WorkSheets[Sheet].Range['N1'].End[xlDown].Row; // 約定通番最終行. end; // Retry が必要か? if BottomGyo < j then begin // 最大行を超えた. Break; // Ok end else if (Day = 0) or (No = 0) or (Trunc(Dt) = 0) or (Ed = 0) or (Dk = 0) then begin // 空行・無効行の確認. bErr := True; Break; // for j Err end else if ((StrToTime('23:50') < TimeOf(Now)) or (TimeOf(Now) < StrToTime('00:10'))) and (10 Lock解除. WorkSheets[Sheet].Unprotect; WorkSheets[Sheet].Range['L1:R300'].Locked := False; end; end; // if bNewTick IncErrCnt(1, k); if bErr or bTickRetry then Timer(50) // Loop else Break; // for k except IncErrCnt(3); end; end; // for k // DB更新とEccelクリア. if bNewTick and (0 < HighTicks) and (not bErr) then begin // DB更新. [1..300] この後、スレッドでDB更新します ----------< PGソース終了 >----------