喫茶XRAYトップページ


[1080] plExcelで印刷範囲の設定返信 削除
2007/2/4 (日) 17:59:30 yumapa
Mr.XRAYさん

先ほどは、SaveDialog利用についてご指導頂きありがとうございました。
もう一つアドバイス頂きたい部分があります。
先ず、今、私が行いたいことは計算式が組み込まれたエクセルシートを
plExcelで使用し、日付・金額を入力して計算させています。
なお、エクセルで作成した元シートは、1頁あたり50行で20頁あります。
データの入力数は様々で、20行で終わる場合もあれば、900行になる場合も
あります。
何れの場合も、最終行までのデータが入力された所までを印刷範囲に設定し
データ入力のされていない部分は出力させたくありません。

参考コードにてMr.XRAYさんが挙げておられた、エクセルの印刷ダイアログを
使用し、選択範囲の印刷を行ったところ、その通りの印刷結果となりました。
しかし、複数のユーザーが今回私が作成しているプログラムを経由せず
直接エクセルシートを開くケースもあります。
従って、エクセルで印刷範囲設定をした時のグレイ表示をさせたいと
思います。
plExcelから印刷範囲設定を行い、かつ設定された範囲をグレイ表示させる
ことは可能でしょうか?

[1081] Re:plExcelで印刷範囲の設定返信 削除
2007/2/4 (日) 19:12:40 Mr.XRAY
▼ yumapaさん

> plExcelから印刷範囲設定を行い、かつ設定された範囲をグレイ表示させる
> ことは可能でしょうか?


なるほど。今すぐ思いつきませんが...
できるかどうかも分かりません。ちょっと考えてみます。

[1082] Re2:plExcelで印刷範囲の設定返信 削除
2007/2/5 (月) 21:12:08 Mr.XRAY
▼ yumapaさん
 
> > plExcelから印刷範囲設定を行い、かつ設定された範囲をグレイ表示させる
> > ことは可能でしょうか?


選択範囲をグレイ表示というのは、選択された状態のことですよね。
エクセルのある範囲を選択状態にしたまま保存すると、次にそのブックを開
いた時に、この選択状態のまま、つまり保存前の状態で表示されます。
しかし、エクセル操作フォームでは、初期状態、選択状態が解除された状態
で表示されます。

もし、エクセル単体と同じ動作仕様で目的が達成されるのであれば、
plExcel.pasのSetSheetStyleメソッドの以下の部分をコメントアウトして
下さい。これは特に必要のない動作です。念のために書いてあるものです。

       if FActiveCell='' then begin                   {初期セル位置}
         FExcelSheet.Cells.Item[1,1].Select; //ここを削除する
       end else begin
         FExcelSheet.Range[FActiveCell,FActiveCell].Select;
       end;


[1083] Re3:plExcelで印刷範囲の設定返信 削除
2007/2/5 (月) 22:09:51 yumapa
▼ Mr.XRAYさん

> 選択範囲をグレイ表示というのは、選択された状態のことですよね。

表現が曖昧で申し訳ありませんでした。
「選択範囲」ではなく「印刷範囲」です。
素人なりに検索してみたところ
  ExcelSheet.PageSetup.PrintArea:='A1:K25';
で印刷範囲の設定が出来ることは確認できました。

今回、ExcelSheet上でマウスにて範囲選択をした上で印刷範囲を
設定したいと考えております。
常に、マウスで範囲選択を行いますので、選択されたセルの
始点セル番地(上記の例で A1)および最終セル番地(上記の例で K25)
が分かれば印刷範囲の設定は可能であることが分かりました。
しかし、私のレベルでは選択された範囲の始点および最終のセル番地を
取得する部分のコーディングで躓いております。
アドバイスをお願い致します。




[1084] Re4:plExcelで印刷範囲の設定返信 削除
2007/2/5 (月) 23:33:42 Mr.XRAY
▼ yumapaさん

私がよく理解していなかったようです。

> しかし、私のレベルでは選択された範囲の始点および最終のセル番地を
> 取得する部分のコーディングで躓いております。


わかりました。調べてみます。
いえ、実は最初はそうだと思ったのですが、もしかしたら...との勘違いです。
考えすぎでした。


[1085] Re5:plExcelで印刷範囲の設定返信 削除
2007/2/6 (火) 00:37:59 Mr.XRAY
まずあるブックを開きます(印刷範囲の設定はないものとします)。
Button01クリックで印刷範囲を設定します。
このブックを閉じます。

再度開いて、Button02をクリックすると、設定した印刷範囲を選択状態に
します。
動作確認 WindowsXP(SP2) + Delphi7

//=============================================================================
//  印刷範囲の設定
//=============================================================================
procedure TplExcelForm2.Button01Click(Sender: TObject);
begin
     ExcelSheet.PageSetup.PrintArea:='A1:E20';
     Self.OverWriteBtnClick(nil);
end;
//=============================================================================
//  印刷範囲の取得とその範囲を選択状態にする
//=============================================================================
procedure TplExcelForm2.Button02Click(Sender: TObject);
var
     APrintAreaStr : String;
     ARangeStr     : String;
     APos          : Integer;
     AStart,AEnd   : String;
begin
     //このシートに設定されている印刷範囲を取得
     APrintAreaStr:= ExcelSheet.PageSetup.PrintArea;

     if APrintAreaStr<>'' then begin
       //セルの文字列を取得
       ARangeStr:=StringReplace(APrintAreaStr,'$','',[rfReplaceAll]);
       APos:=Pos(':',ARangeStr);
       AStart:=Copy(ARangeStr,1,APos-1);
       AEnd  :=Copy(ARangeStr,APos+1,Length(ARangeStr));

       //その範囲を選択状態にする
       ExcelSheet.Range[AStart,AEnd].Select;
     end else begin
       ShowMessage('印刷範囲は設定されていません。');
     end;
end;




[1086] Re6:plExcelで印刷範囲の設定返信 削除
2007/2/6 (火) 07:32:01 Mr.XRAY
また勘違いかな。

>plExcelから印刷範囲設定を行い、かつ設定された範囲をグレイ表示させる
>ことは可能でしょうか?


エクセルを単独で開いた時に印刷範囲を選択状態にしたいということですよね。
となると、印刷範囲を選択状態にするコードを、エクセルのマクロとして
保存し、このマクロを、エクセルの起動時に自動実行する、
という方法はどうでしょうか。
[1085]のButton02Clickのコードをマクロ(VBA)で書くわけですが、マクロの
コードは... セルの文字列を取得の部分をどう書いたら...




[1087] Re7:plExcelで印刷範囲の設定返信 削除
2007/2/6 (火) 08:51:55 TS
Mr.XRAYさん お世話になります。
Selection.CurentRegion.Selectはどうでしょうか
空白で囲まれた領域を選択します。
 

[1088] Re8:plExcelで印刷範囲の設定返信 削除
2007/2/6 (火) 08:55:22 TS
訂正します。
Selection.CurrentRegion.Select
 

[1089] Re9:plExcelで印刷範囲の設定返信 削除
2007/2/6 (火) 09:42:17 yumapa
Mr.XRAYさん、TSさん
アドバイスありがとうございます。

[1085]で、Mr.XRAYさんからご回答頂いた
 
> //=============================================================================
> //  印刷範囲の設定
> //=============================================================================
> procedure TplExcelForm2.Button01Click(Sender: TObject);
> begin
>      ExcelSheet.PageSetup.PrintArea:='A1:E20';
>      Self.OverWriteBtnClick(nil);
> end;


の部分ですが、
印刷範囲をエクセル操作フォーム上から設定する方法として
マウスで印刷範囲としたい部分を範囲選択し、フォーム上の
Button1.Clickで印刷範囲設定を行いたいのです。
上記コードの 'A1:E20' の部分をマウスによる範囲選択に
よってセル番地を取得する必要があります。

エクセル操作フォームにおけるActiveCellプロパティで
セル番地を取得できるように、範囲選択したセル範囲の
最終セル番地を取得するにはエクセルのマクロとして
記載するしかないでしょうか?



[1090] Re10:plExcelで印刷範囲の設定返信 削除
2007/2/6 (火) 12:30:41 TS
A1のセルを選択
Selection.CurrentRegion.Select
はデータの最終番地を示します。
E20の後が空白行なら
'A1:E20'が結果として出ます。

[1091] Re11:plExcelで選択範囲あるいはデータ範囲の取得返信 削除
2007/2/6 (火) 19:06:09 Mr.XRAY
▼ TSさん、こんちには。どうもです。

>Selection.CurrentRegion.Select

こんなのがあったのですね。知りませんでした。

 yumapaさん、エクセル操作フォームの上でということで、いろいろコード
を書いてみましたので参考にして下さい。

//=============================================================================
//  選択範囲の範囲を取得  その1 個別に列番号と行番号を求める
//=============================================================================
procedure TplExcelForm2.Button2Click(Sender: TObject);
var
     ARange   : OleVariant;
     Col1     : Integer;
     Col2     : Integer;
     Row1     : Integer;
     Row2     : Integer;
     i1       : Integer;
     i2       : Integer;
     AreaStr  : String;
begin
     //表示中のシートの選択範囲
     ARange   :=ExcelApp.Selection[0];
     //左上と右下のセルの列と行を取得
     Col1 := ARange.Column;
     Col2 := ARange.Columns.Count-1+Col1;
     Row1 := ARange.Row;
     Row2 := ARange.Rows.Count-1+Row1;
     //セル番地
     i1 := Ord('A')+Col1-1;
     i2 := Ord('A')+Col2-1;
     AreaStr := Chr(i1)+IntToStr(Row1)+':'+Chr(i2)+IntToStr(Row2);
     //確認表示
     ShowMessage(AreaStr);
end;
//=============================================================================
//  選択範囲の範囲を取得 その2 Addressプロパティ使用
//=============================================================================
procedure TplExcelForm2.Button3Click(Sender: TObject);
var
     ARange   : OleVariant;
     AreaStr  : String;
begin
     //表示中のシートの選択範囲
     ARange:=ExcelApp.Selection[0];
     //確認表示
     AreaStr:=ARange.Address;
     AreaStr:=StringReplace(AreaStr,'$','',[rfReplaceAll]);
     ShowMessage(AreaStr);
end;
//=============================================================================
//  データのある範囲を取得  その1 個別に列番号と行番号を求める
//  データがあるどれかのセルがアクティブであれば、その範囲全体を知ることが可能
//=============================================================================
procedure TplExcelForm2.Button4Click(Sender: TObject);
var
     ARange   : OleVariant;
     Col1     : Integer;
     Col2     : Integer;
     Row1     : Integer;
     Row2     : Integer;
     i1       : Integer;
     i2       : Integer;
     AreaStr  : String;
begin
     //選択中の範囲
     ARange:=ExcelApp.Selection[0];
     //データのある領域全体を選択状態にする
     ARange.CurrentRegion.Select;
     //左上と右下のセルの列と行を取得
     Col1 := ARange.CurrentRegion.Column;
     Col2 := ARange.CurrentRegion.Columns.Count-1+Col1;
     Row1 := ARange.CurrentRegion.Row;
     Row2 := ARange.CurrentRegion.Rows.Count-1+Row1;
     //セル番地
     i1 := Ord('A')+Col1-1;
     i2 := Ord('A')+Col2-1;
     AreaStr := Chr(i1)+IntToStr(Row1)+':'+Chr(i2)+IntToStr(Row2);
     //確認表示
     ShowMessage(AreaStr);
end;
//=============================================================================
//  データのある範囲を取得  その2 Addressプロパティ使用
//  データがあるどれかのセルがアクティブであれば、その範囲全体を知ることが可能
//=============================================================================
procedure TplExcelForm2.Button5Click(Sender: TObject);
var
     ARange   : OleVariant;
     AreaStr  : String;
begin
     //選択中の範囲
     ARange:=ExcelApp.Selection[0];
     //データのある領域全体を選択状態にする
     ARange.CurrentRegion.Select;
     //確認表示
     AreaStr:=ARange.CurrentRegion.Address;
     AreaStr:=StringReplace(AreaStr,'$','',[rfReplaceAll]);
     ShowMessage(AreaStr);
end;
//=============================================================================
//  選択範囲を印刷範囲として設定
//  セル番地を個別に求める方法とCurrentRegionプロパティを使用する方法は省略
//=============================================================================
procedure TplExcelForm2.Button6Click(Sender: TObject);
var
     ARange  : OleVariant;
     AreaStr : String;
begin
     //表示中のシートの選択範囲
     ARange :=ExcelApp.Selection[0];
     AreaStr:=ARange.Address;
     if Pos(':',AreaStr)<>0 then begin
       //その範囲を印刷範囲とする
       ExcelSheet.PageSetup.PrintArea:=AreaStr;
     end;
end;

また、ブックに以下のマクロを登録しておけば、このブックを開いた時に
設定されている印刷範囲を選択状態にします。

Sub Auto_Open()
   Dim AArea As String
   AArea = ""
   AArea = ActiveSheet.PageSetup.PrintArea
   If AArea <> "" Then
     Range(AArea).Select
   Else
     MsgBox "印刷範囲は設定されていません。"
   End If
End Sub



[1092] Re12:plExcelで選択範囲あるいはデータ範囲の取得返信 削除
2007/2/6 (火) 21:50:06 yumapa
▼ Mr.XRAYさん

全く思い通りの動作を得ることができました。
また、これほど長いコーディングをわざわざ書いて
頂き大変恐縮しております。
ありがとうございました。

[1093] Re13:plExcelで選択範囲あるいはデータ範囲の取得返信 削除
2007/2/6 (火) 23:51:13 Mr.XRAY
▼ yumapaさん

> 全く思い通りの動作を得ることができました。
>また、これほど長いコーディングをわざわざ書いて


なんかの役に立つかなと思って、同じようなコードを書いてはみたのですが、
本当に役に立ったのか不安なんですけど... 。いいことにして下さい(笑)

それにしても CurrentRegion は使えますね。値つまりデータのある範囲を
知りたいというのは、他のBBSで質問を読んだことがあります。
もしかしたらTSさんがレスしていたのかも...


[1094] Re14:plExcelで選択範囲あるいはデータ範囲の取得返信 削除
2007/2/7 (水) 13:48:54 TS
最近Excelを見直しまして色々やってます。
Mr.XRAYさんのホームページに
大変助けてもらってます。

CurrentRegionは
VBA Excel97ハンドブックという
西田雅明さん著にのってました。
もうずいぶん昔に買った本ですが
最近役に立ってます。

[1095] Re15:plExcelで選択範囲あるいはデータ範囲の取得返信 削除
2007/2/7 (水) 19:01:07 Mr.XRAY
▼ TSさん

> Mr.XRAYさんのホームページに
> 大変助けてもらってます。


そんな、とんでもありません。

> VBA Excel97ハンドブックという

これは持っていませんが、VBA Word97/98ハンドブックというのを持っています。


[1096] Re16:plExcelで選択範囲あるいはデータ範囲の取得返信 削除
2007/2/7 (水) 21:34:08 TS
> これは持っていませんが、VBA Word97/98ハンドブックというのを持っています。
女性の方が書かれていたと思います。
これも買おうか迷って止めました。
個人的には一太郎オンリーなもので。
今回もバージョンアップして明日来る予定です、楽しみです。

ほんというと聞きたいことだらけなのですが。
解らないのを解くのも時間があるときはゲーム感覚でおもしろいです。

その内また教えて下さい。
ではまた宜しくお願いします。

INCM/CMT
Cyclamen v3.82