ExcelのWorksheetおよびRangeオブジェクトを使用したKama Sutra

「デルファイエクセルレンジ」タイプの検索クエリを何度も実行すると、既成のプログラムコードの提案された例の途方もない貧困、貧弱さ、および効率性の欠如が見つかりました。 最良のケースでは、任意のセルに出力するいくつかの操作について話します。Excelオブジェクトへの書式設定やアクセスなどの微妙な違いは、単に忘れられるだけではありません。 著者は、Delphiの構文を考慮に入れて、マクロの記録によって生成されたコードを、レポートを印刷するアプリケーションのコードに転送することだけを提供しています。 さらに、ほとんどの例では、転送の最も恐ろしい瞬間のいくつかを隠すレイトバインディングが使用されますが、そのようなコードはVBAコードと同じようには機能せず、すべての操作が適切に処理されません。 その結果、特定のバージョンのDelphi / RAD Studioでのみコンパイルされ、特定のバージョンのOfficeでのみ動作する不必要に面倒なソースを取得します。



他の人のソースを分解して、そのようなデザインに遭遇しなかったのは誰ですか?



Worksheet.Range[Worksheet.Cells[i, 1], Worksheet.Cells[i, MaxCols]].MergeCells := True; Worksheet.Range[Worksheet.Cells[i, 1], Worksheet.Cells[i, MaxCols]].HorizontalAlignment := xlCenter; Worksheet.Range[Worksheet.Cells[i, 1], Worksheet.Cells[i, MaxCols]].VerticalAlignment := xlCenter; for j := 1 to MaxCols do Worksheet.Cells[i + 1, j].Value := j;
      
      





この場合、特定のサイクルで、セルは行ごとにマージされ、セルの中央に列AからMaxColsまで配置され、列番号が次の行に印刷されます。 そして、それは時々機能するようで、時には機能しないようです。 たとえば、セルが結合され、位置合わせによりエラーが発生します。 さらに、どの例でも、このようにセルが厳密に割り当てられます。 しかし、間違ったワークシートがRangeパラメーターに入るとどうなりますか? しかし、この範囲で別の100500操作を行うとどうなりますか?



もちろん、構造を保存すると、もちろん節約できますが、完璧ではありません。 その中の整列はまだ機能しません。 また、すべての言語で利用できるわけではありません。 悪の根は、細胞のマトリックスのアドレス指定と遅延バインディングに潜んでいます。 事前バインディングのコードを書き直します。



 Worksheet.Range[Worksheet.Cells.Item[i, 1], Worksheet.Cells.Item[i, MaxCols]].MergeCells := True; Worksheet.Range[Worksheet.Cells.Item[i, 1], Worksheet.Cells.Item[i, MaxCols]].HorizontalAlignment := xlCenter; Worksheet.Range[Worksheet.Cells.Item[i, 1], Worksheet.Cells.Item[i, MaxCols]].VerticalAlignment := xlCenter; for j := 1 to MaxCols do Worksheet.Cells.Item[i + 1, j].Value[xlRangeValueDefault] := j;
      
      





悪夢は続きます。 下劣な.Itemが追加されました。 しかし、アライメントは機能しました。 さて、悲しいことについては話しましょう。 Rangeオブジェクト、またはそのResizeプロパティとOffsetプロパティを詳しく見ると、DelphiからExcelでレポートを作成する真の道が開きます。 コードは非常にエレガントになります。



 //   Range := Worksheet.Cells.Item[i, 1].Resize[1, MaxCols],    :( Range := Worksheet.Range[Worksheet.Cells.Item[i, 1], EmptyParam].Resize[1, MaxCols]; Range.MergeCells := True; Range.HorizontalAlignment := xlCenter; Range.VerticalAlignment := xlCenter; Range := Range.Resize[1, 1]; for j := 1 to MaxCols do Range.Offset[1, j - 1].Value2 := j;
      
      





実験したい人のために、オートコンプリートセルを使用したオプションも提案します。



 //   for: Range := Range.Offset[1, 0].Resize[1, 1]; Range.Value2 := 1; Range.AutoFill(Range.Resize[1, MaxCols], xlFillSeries);
      
      





さて、Worksheet.RangeにWorksheet.Cells.Itemをラップすることを気にしないために、名前付き範囲を持つレポートテンプレートの作成を検討する必要があります。 これにより、ソフトウェアコードの書式設定も節約されます。 しかし、次回については。



All Articles