[ 新規に投稿する ]

エクセルの全セル内容取得No.09579
styth さん 21/09/11 13:04 [ コメントを投稿する ]
  //目次− COMの呼び出し−サンプル 

//●エクセルのセル内容取得

//WSH(VBS)
//  Set objExcel = WScript.GetObject("c:\folder\test.xls")
//  WScript.Echo objExcel.Sheets("Sheet1").Cells(1,1)

#objXls = getobject(@"C:\Users\USER\Documents\test.xls");
#objSheet = member(#objXls, "Sheets", "Sheet1" );
#objCells = member( #objSheet, "Cells" );
#objCell = member(#objCells,"Item", 1,2);
message member( #objCell ); //デフォルトのプロパティ
endmacro;

 このマクロを直して、Sheet1の全セル(使用されているもの)をクリップボー
ドにコピーしたいのですが、全セルをどう指定すれば良いか分かりせん。
 よろしくお願いいたします。
[ ]
RE:09579 エクセルの全セル内容取得No.09580
h-tom さん 21/09/11 13:43 [ コメントを投稿する ]
  h-tom です。

> このマクロを直して、Sheet1の全セル(使用されているもの)をクリップボー
>ドにコピーしたいのですが、全セルをどう指定すれば良いか分かりせん。
Excelの事なら、ここ(秀丸マクロ会議室)ではなくOfficeの話題を扱うコミュニティで聞いた方が早いと思いますけど?
vba/wshを秀丸マクロに変換する方法がわからないなら、ここ(秀丸マクロ会議室)ですが。
[ ]
RE:09579 エクセルの全セル内容取得No.09581
おすぎ さん 21/09/11 14:56 [ コメントを投稿する ]
  おすぎです。

UsedRange を使えば良いと思います。

#objUsedCells = member( #objSheet, "UsedRange" );

みたいな感じです。見当違いだったらすみません。

https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheet.usedrange
[ ]
RE:09580 エクセルの全セル内容取得No.09585
styth さん 21/09/16 01:03 [ コメントを投稿する ]
  >vba/wshを秀丸マクロに変換する方法がわからないなら、ここ(秀丸マクロ会議室)ですが。


Option Explicit

Dim objExcel

'エクセルオブジェクトを作成します
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Open "C:\Users\USER\Documents\test.xls"

objExcel.Sheets(1).UsedRange.Select
objExcel.Selection.Copy

h ttps://seesaawiki.jp/w/twoflat1017/d/%28VBScript%29Excel%A4%CE%C9%BD%A4%F2%A5%B3%A5%D4%A1%BC%A4%B7%A1%A2Word%A4%CB%C5%BD%A4%EA%C9%D5%A4%B1%A4%EB

 を参考にVBSを作成しました。これを実行した後、クリップボードを見ると、
コピーされているようです。
 これを秀丸マクロでやるとしたら、どうすれば、良いのでしょうか?
[ ]
RE:09581 エクセルの全セル内容取得No.09586
styth さん 21/09/16 01:07 [ コメントを投稿する ]
  >UsedRange を使えば良いと思います。
 上記で、UsedRange、使わせて頂きました。
[ ]
RE:09585 エクセルの全セル内容取得No.09587
h-tom さん 21/09/16 07:37 [ コメントを投稿する ]
  h-tom です。

> これを秀丸マクロでやるとしたら、どうすれば、良いのでしょうか?
何処まで出来ているのでしょうか?
必要なオブジェクトを取得して、メソッドやプロパティを呼び出すだけですよ。

>objExcel.Sheets(1).UsedRange.Select
秀丸マクロはメソッドチェーンに対応していないので、上記内容だと各部をバラバラにして呼び出す必要があります。
1)objExcelを取得
2)objExcelから、Sheetsオブジェクト取得
3)Sheetsオブジェクトから、UsedRangeオブジェクト取得
4)UsedRangeオブジェクトのSelectメソッド呼び出し
となります。

あと、オブジェクトの取得や、メソッド/プロパティの呼び出しに失敗してもわからないので、
getresultex(10) の戻り値で確認したほうがいいでしょう。

最終的に何をしたいのかわかりませんが、run文使ってVBS呼び出した方が早い場合もありますよ。
[ ]
RE:09585 エクセルの全セル内容取得No.09588
ラフ さん 21/09/16 15:42 [ コメントを投稿する ]
  > これを秀丸マクロでやるとしたら、どうすれば、良いのでしょうか?
まず、何故秀丸マクロでやりたいのかがわかりません。
VBAで出来ているならVBAのプロシージャーを呼び出す方が簡単です。
エクセルファイルがいっぱい有って全部に入れるのは面倒とかですかね。

h-tomさんも書かれてますが、最終目標が判らないので何とも言えませんが、エクセル連携ならVBSの方がいいです。

クリップボードに入れるという事は、そのデータを他のソフトで利用するってことで、秀丸で利用するわけではないですよね?
秀丸で利用するならわざわざクリップボードに入れずに変数に取り出せばいいです。データサイズにもよりますが。

VBAで文字列データに変換するのが面倒だからクリップボードに入れるという選択肢はあります。
VBA側でクリップボードに入れてテキストで取り出して文字列データにしてしまえば済むので、それを文字列を返すFunctionにしておけば一発です。

VBA側
Public Function getUsedRangeData() As String

    Dim objSheet As Worksheet
    Set objSheet = Application.Worksheets(1)
    objSheet.UsedRange.Copy
    With New DataObject
        .GetFromClipboard
        getUsedRangeData = .GetText
    End With
    
End Function

秀丸側
#objXls = getobject(@"C:\Users\USER\Documents\test.xls");
#objSheet = member(#objXls, "Sheets", "Sheet1" );
if( getresultex(10) == false ) { // エラー
 #comErr = getresultex(11);
 message "Sheets" + " Error:" +hex(#comErr);
 endmacro;
}

// 文字列で取り出す場合(VBA側でクリップボードにも入れてる)
$ret = member( #objSheet, "getUsedRangeData" );
if( getresultex(10) == false ) { // エラー
 #comErr = getresultex(11);
 message "getUsedRangeData" + " Error:" +hex(#comErr);
 endmacro;
}
message $ret;
[ ]
RE:09588 エクセルの全セル内容取得No.09589
ラフ さん 21/09/16 20:17 [ コメントを投稿する ]
  自分で書いたものだけど(^^;
当該bookを開いていないとエラーになりますね。もうちょっと考えよう。
あと、当該bookを開いてなく。かつ他のbookが開かれてると何故かそのbookのSheet1の内容をとってきてしまいますね。
こちらは秀丸マクロの内部の問題かな。
[ ]
RE:09589 エクセルの全セル内容取得No.09590
ラフ さん 21/09/16 20:40 [ コメントを投稿する ]
  >自分で書いたものだけど(^^;
>当該bookを開いていないとエラーになりますね。もうちょっと考えよう。
>あと、当該bookを開いてなく。かつ他のbookが開かれてると何故かそのbookのSheet1の内容をとってきてしまいますね。
>こちらは秀丸マクロの内部の問題かな。
違った。わかりました。Applicationオブジェクト使ったからですね(^^;

もとのstythさんのVBAマクロ利用して

Public Function getUsedRangeData()
    Dim objExcel
    
    'エクセルオブジェクトを作成します
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = True
    objExcel.Workbooks.Open "C:\Users\USER\Documents\test.xls"
    
    objExcel.Sheets(1).UsedRange.Select
    objExcel.Selection.Copy

    With New DataObject
        .GetFromClipboard
        getUsedRangeData = .GetText
    End With

End Function
に置き換えればOKだけど、一々ウィンドウ開くのね。
[ ]
RE:09588 エクセルの全セル内容取得No.09591
styth さん 21/09/17 00:28 [ コメントを投稿する ]
   返事が遅くなり申し訳ありません。


>まず、何故秀丸マクロでやりたいのかがわかりません。

 事情をお話ししますと、

 とある人(Aさん)のパソコンには、エクセル互換のWPSが入っていますが、
VBAは付いていません。
 なので、エクセルのマクロは彼のパソコンでは、使えません。
 そこで、

1. シートをクリップボードにコピー(手動)
   ↓
2. 秀丸マクロで、処理後、クリップボードにコピー
   ↓
3. クリップボードの中身をシートに貼り付け(手動)

 という、操作をしています。

 今回、ヘルプを見ていたら、エクセルのことが書いてあったので、1.の部分を
マクロで出来ないかと思い、ご相談した次第です。


>VBAで出来ているならVBAのプロシージャーを呼び出す方が簡単です。
 すみません。上記により、出来ません。

>エクセルファイルがいっぱい有って全部に入れるのは面倒とかですかね。
 これには、該当しません。

>h-tomさんも書かれてますが、最終目標が判らないので何とも言えませんが、エクセル連携ならVBSの方がいいです。
 最終目標は、「1. シートをクリップボードにコピー」して、これを秀丸マ
クロで実現して、2.にくっつけたい、です。

>クリップボードに入れるという事は、そのデータを他のソフトで利用するってことで、秀丸で利用するわけではないですよね?
 最終的には、WPSで使います。
[ ]
RE:09588 エクセルの全セル内容取得No.09592
styth さん 21/09/17 07:43 [ コメントを投稿する ]
   教えて頂いたマクロを元に、以下を実行しました。


//秀丸側
#objXls = getobject(@"C:\Users\USER\Documents\test.xls");
#objSheet = member(#objXls, "Sheets", "Sheet1" );
if( getresultex(10) == false ) { // エラー
 #comErr = getresultex(11);
 message "Sheets" + " Error:" +hex(#comErr);
 endmacro;
}
#UsedRange = member(#objSheet, "UsedRange" );
if( getresultex(10) == false ) { // エラー
 #comErr = getresultex(11);
 message "UsedRange" + " Error:" +hex(#comErr);
 endmacro;
}
//$Select = member(#UsedRange, "Select" );
$s=callmethod_returnstr( #UsedRange, "Select" );

if( getresultex(10) == false ) { // エラー
 #comErr = getresultex(11);
 message "Select" + " Error:" +hex(#comErr);
 setclipboard "Select" + " Error:" +hex(#comErr);
 endmacro;
}
setclipboard $Select;


>4)UsedRangeオブジェクトのSelectメソッド呼び出し
 ここで、エラーになります。

//$Select = member(#UsedRange, "Select" );
$s=callmethod_returnstr( #UsedRange, "Select" );
 いずれも、実行時、
 Select Error:80020009、となりました。
[ ]
RE:09591 エクセルの全セル内容取得No.09593
ラフ さん 21/09/17 13:35 [ コメントを投稿する ]
  > とある人(Aさん)のパソコンには、エクセル互換のWPSが入っていますが、
>VBAは付いていません。

互換ソフトですか、VBA非搭載なら、そもそもCOM経由でできる事はあまりないような気がします。
UsedRangeとかまんまVBAエンジンが処理しそうですけど。
というか、そもそもCOMサポートしてますか?
実際にWPSでどこまで出来るか確認してますか?
それらを先に確認しないと全てが徒労に終わりますよ。

あと、過去の私の投稿 09389 COM呼び出しについて 空のスレを読めばわかるかと思いますが、秀丸マクロのCOM呼び出しはCOMの全ての機能ができるわけではありませんし(09389の問題は修正されてるようですが)、
エクセル側もどこまでCOMに対応しているか不明です。
エクセルの機能の全てを使用できると考えない方がいいです。特に互換ソフトなら尚更の事です。
[ ]
RE:09592 エクセルの全セル内容取得No.09594
でるもんたいいじま さん 21/09/17 13:51 [ コメントを投稿する ]
  でるもんた・いいじまです。

互換ソフトの事なので、徹底的に確認していきましょう。

> #objXls = getobject(@"C:\Users\USER\Documents\test.xls");

そもそもこれがマトモに取得できていない可能性があります。
上記の行の直後に、この1行を入れてみてください。
message sprintf("getobject() result : #objXls = 0x%08X", #objXls);

> #objSheet = member(#objXls, "Sheets", "Sheet1" );
ここも同様です。上記の行の直後に次の1行。
message sprintf("member() result : #objSheet = 0x%08X", #objSheet);

> #UsedRange = member(#objSheet, "UsedRange" );
ここまでは不明ですが、この直後に
message sprintf("member() result : #UsedRange = 0x%08X", #UsedRange);
とすると、たぶん 0x00000000 が出てくると思います。
[ ]
RE:09592 エクセルの全セル内容取得No.09595
ラフ さん 21/09/17 14:02 [ コメントを投稿する ]
  Selectは当該シートがActiveSheetでないとエラーになるようなので、エクセルで当該bookが起動されていれば、Selectできると思います。
それでもSelect失敗するならActivateを呼び出すといいでしょう。

あと、UsedRangeはRangeオブジェクトなのでCopyメソッドを持っていますから一々Selectする必要はなくUsetRange.Copyでクリップボードに入ります。

member #UsedRange, "Copy" ;
if( getresultex(10) == false ) { // エラー
 #comErr = getresultex(11);
 message "Copy" + " Error:" +hex(#comErr);
 endmacro;
}

エクセルならばですが
[ ]
RE:09594 エクセルの全セル内容取得No.09596
styth さん 21/09/18 07:56 [ コメントを投稿する ]
  >> #objXls = getobject(@"C:\Users\USER\Documents\test.xls");
>そもそもこれがマトモに取得できていない可能性があります。
>上記の行の直後に、この1行を入れてみてください。
>message sprintf("getobject() result : #objXls = 0x%08X", #objXls);
 0x00000001、が表示されます。

>> #objSheet = member(#objXls, "Sheets", "Sheet1" );
>ここも同様です。上記の行の直後に次の1行。
>message sprintf("member() result : #objSheet = 0x%08X", #objSheet);
 0x00000002、が表示されます。

>> #UsedRange = member(#objSheet, "UsedRange" );
>ここまでは不明ですが、この直後に
>message sprintf("member() result : #UsedRange = 0x%08X", #UsedRange);
>とすると、たぶん 0x00000000 が出てくると思います。
  0x00000003、が表示されます。

 クリップボードを見ると、成功しています。ありがとうございました。
 (Aさんのパソコンで実行しました)

[ ]
RE:09595 エクセルの全セル内容取得No.09597
styth さん 21/09/18 08:05 [ コメントを投稿する ]
  >member #UsedRange, "Copy" ;
>if( getresultex(10) == false ) { // エラー
> #comErr = getresultex(11);
> message "Copy" + " Error:" +hex(#comErr);
> endmacro;
>}

 ここは、以下のようにして、実行しました。
 マクロ全部を掲載します。


//秀丸側
setclipboard "";
#objXls = getobject(@"C:\Users\USER\Documents\test.xls");
message sprintf("getobject() result : #objXls = 0x%08X", #objXls);
setclipboard sprintf("getobject() result : #objXls = 0x%08X", #objXls);

#objSheet = member(#objXls, "Sheets", "aaa" );
message sprintf("member() result : #objSheet = 0x%08X", #objSheet);
addclipboard sprintf("member() result : #objSheet = 0x%08X", #objSheet);
if( getresultex(10) == false ) { // エラー
 #comErr = getresultex(11);
 message "Sheets" + " Error:" +hex(#comErr);
 endmacro;
}
#UsedRange = member(#objSheet, "UsedRange" );
message sprintf("member() result : #UsedRange = 0x%08X", #UsedRange);
addclipboard sprintf("member() result : #UsedRange = 0x%08X", #UsedRange);
if( getresultex(10) == false ) { // エラー
 #comErr = getresultex(11);
 message "UsedRange" + " Error:" +hex(#comErr);
 endmacro;
}
#Select = member(#UsedRange, "Copy" );
//#Select=callmethod_returnstr( #UsedRange, "Select" );

if( getresultex(10) == false ) { // エラー
 #comErr = getresultex(11);
 message "Select" + " Error:" +hex(#comErr);
 setclipboard "Select" + " Error:" +hex(#comErr);
 endmacro;
}
//setclipboard $Select;
message "end";

 最後に「end」が表示され、クリップボードは、期待したのものが、貼り付いています。
 ありがとうございました。
[ ]
RE:09597 エクセルの全セル内容取得No.09598
styth さん 21/09/18 08:09 [ コメントを投稿する ]
   間違えて、

#Select = member(#UsedRange, "Copy" );

 としてしまいましたが、大丈夫です。
[ ]
RE:09596 エクセルの全セル内容取得No.09599
でるもんたいいじま さん 21/09/18 13:03 [ コメントを投稿する ]
  こんにちは。でるもんた・いいじまです。

まずは

> クリップボードを見ると、成功しています。ありがとうございました。
> (Aさんのパソコンで実行しました)

とのことで、おつかれさまでした。

☆ ☆ ☆

> >message sprintf("getobject() result : #objXls = 0x%08X", #objXls);
>  0x00000001、が表示されます。

> >message sprintf("member() result : #objSheet = 0x%08X", #objSheet);
>  0x00000002、が表示されます。

> >message sprintf("member() result : #UsedRange = 0x%08X", #UsedRange);
> >とすると、たぶん 0x00000000 が出てくると思います。
>   0x00000003、が表示されます。

なるほど、この値は1から順に連番で割り当てられていくのですね。
確かに、生ポインタをそのままマクロの変数に格納するのもアレですし。
[ ]
RE:09597 エクセルの全セル内容取得No.09600
ラフ さん 21/09/18 14:42 [ コメントを投稿する ]
  上手くいったようで良かったですね。
Copyの戻り値はたぶん誰も使わないので問題ないです。というか何が返ってきてるのか知りません。
VBAのないStandardやPersonal版のWPSでそこまで動くなら、VBSと組み合わせれば、かなりのVBAライクな事ができそうな気がしますね。
私は使いませんが(笑)
[ ]

[ 新規に投稿する ]