Excel VBAを使ってIEなどのプログラムのクライアント領域の
ウインドウのサイズを指定・変更したいと考えています。

http://www.excel-vba.net/excel-api-020.html

このページのコードを使ってサイズの取得だけはできるようになりました。

次に設定を行いたいのですが

http://home.att.ne.jp/zeta/gen/excel/c04p58.htm

このページにあるように


Dim window1 As Window
Set window1 = Windows("Google - Internet Explorer") 'アプリケーションウィンドウを対象
window1.WindowState = xlNormal '通常表示に設定します。
window1.Width = 800 'ウィンドウ幅を800に設定
window1.Height = 300 'ウィンドウの高さを300に設定



とやってみましたが
インデックスが有効範囲にありません
というエラーが出てしまいます。

どうすれば良いでしょうか?

あと気になっているのですが
幅及び高さの単位はポイントです。(ピクセルでは無いので注意して下さい)。
と書かれてありますが、
ピクセルからポイントへはどのように換算すれば良いのでしょうか?

質問者からの補足コメント

  • ありがとうございます。

    ウインドウの位置・サイズの変更はできました。
    ただ一つ問題なのですが

    SetWindowPosではモニター座標でのクライアント領域の座標を指定する必要があります。
    一方で、

    GetWindowRectではモニター座標(0,0)を原点とした非クライアント領域の位置座標
    GetClientRectではクライアント座標(0,0)を原点としたクライアント領域の位置座標
    を得ることができます。
    しかしながらこれらの方法を組み合わせても
    クライアント領域のモニター座標を得ることができません。

    どうすればモニター座標(0,0)を原点とした
    クライアント領域の座標を得ることができますでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/11/20 23:27

このQ&Aに関連する最新のQ&A

A 回答 (1件)

2つ目のリンクの説明はExcel内のウィンドウを扱うものですから、質問の件の参考にはなりません。


1つ目のリンクの例のように、WindowsAPIを呼び出す必要あります。
WindowsAPIはC言語の関数の体裁をしていますので、理解するには若干のC言語の知識が必要です。

ウィンドウのサイズ変更は SetWindowPos 関数でできました。関数の説明はここにあります。
https://msdn.microsoft.com/ja-jp/library/cc41120 …

-----------------------------------------------------
Option Explicit

'ウィンドウ位置を維持する
Public Const SWP_NOMOVE = &H2&
'ウィンドウのZオーダーを維持する
Public Const SWP_NOZORDER = &H4&

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long

Private Declare Function SetWindowPos Lib "user32.dll" ( _
ByVal hWnd As Long, _
ByVal hWndInsetAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal uFlags As Long _
) As Long

'メモ帳のウィンドウサイズを変更するサンプル
Public Sub ChangeRect()
Dim hWnd As Long
hWnd = FindWindow(vbNullString, "無題 - メモ帳")

Call SetWindowPos(hWnd, -1, -1, -1, 400, 300, SWP_NOMOVE Or SWP_NOZORDER)
End Sub
この回答への補足あり
    • good
    • 0

このQ&Aに関連する人気のQ&A

このQ&Aと関連する良く見られている質問

Qマクロ初心者です。 インデックスが有効範囲にありませんとエラーになりました。 Dim Open

マクロ初心者です。
インデックスが有効範囲にありませんとエラーになりました。



Dim OpenFileName As string
Dim book1 As Workbook
Dim sheet1 As worksheet

sub 問題 ()

OpenFileName = GetOpenFileName(”エクセルファイル,*.*”)
If OpenFileName <>”False” Then
workbooks.Open OpenFileName
Else
msgbox ”キャンセルしました”
Exit sub
EndIf

Set book1 = Activeworkbook

Activesheet.Copy Before:=Thisworkbook.sheet(1)

workbooks(”book1”).Close SaveChanges:=False

Set sheet1 = Activesheet

ここまで作りました。

管理台帳を開き、
別ファイルにコピーし
管理台帳は閉じる、というところで、
実行するとエラーとなり、
デバッグをクリックしたら、管理台帳を閉じるコードが黄色くなります。

()の中の”を消してもダメでした。
配列数が大きい時と存在しない名前を指定した時になるとのことですが、、
Set〜のコードは、取得できていないのでしょうか?

マクロ初心者です。
インデックスが有効範囲にありませんとエラーになりました。



Dim OpenFileName As string
Dim book1 As Workbook
Dim sheet1 As worksheet

sub 問題 ()

OpenFileName = GetOpenFileName(”エクセルファイル,*.*”)
If OpenFileName <>”False” Then
workbooks.Open OpenFileName
Else
msgbox ”キャンセルしました”
Exit sub
EndIf

Set book1 = Activeworkbook

Activesheet.Copy Before:=Thisworkbook.sheet(1)

workbooks(”book1”).Close SaveChanges:=False

Set sheet1 = Ac...続きを読む

Aベストアンサー

こんにちは

>Set〜のコードは、取得できていないのでしょうか?
ご提示のコードではbook1が変数(=ワークブック)として設定されており、
 Set book1 = Activeworkbook
によって、Activeworkbookのオブジェクトが代入されています。

それなので、このブックを閉じるのであれば
 book1.Close SaveChanges:=False
で良いはずです。

>ネットでは、workbook(book1).Close〜
>もしくはworkbook(”book1.xls”)など
workbooks(”book1.xls”).Closeは、”book1.xls”(=文字列)という名のブックを閉じる際に用いますし、workbooks(book1).Closeの場合は、book1が文字列変数等であると考えられます。
例えば
 book1 = ”book1.xls”
 workbooks(book1).Close
で、一行目と同じ意味になりますよね。

変数とその意味するところを理解して使い分けることが必要です。
というか、意味を決めているのはそのコードを作成している質問者様なのですが。

こんにちは

>Set〜のコードは、取得できていないのでしょうか?
ご提示のコードではbook1が変数(=ワークブック)として設定されており、
 Set book1 = Activeworkbook
によって、Activeworkbookのオブジェクトが代入されています。

それなので、このブックを閉じるのであれば
 book1.Close SaveChanges:=False
で良いはずです。

>ネットでは、workbook(book1).Close〜
>もしくはworkbook(”book1.xls”)など
workbooks(”book1.xls”).Closeは、”book1.xls”(=文字列)という名のブックを閉じる際に用います...続きを読む

QFortranの'read'のVBへの書き換え方

Fortranのread/writeをVBへの書き換え方を教えて下さい。

他の方の作られたfortran.90のprogramをvisual basicに書きなおす作業をしています。その中の下記のfileのaccessが上手出来ません。このなかに有るbinary,とかbig_endianが原因のようです。
(これの無いfile accessの箇所は問題なく出来ました。)

program内でdataをfileに書込み保存して蓄積しているようで、後日このdataをreadして使うようになっていますので新しくfileを作り直すわけにもいきません。

いろいろとcodeを入れてみたが、結果は文字化けばかりで10日も費してしまいました。

binary,bigendianなどの理屈が判っていないのでどうしょうもないと感じました。
どうか下記のfortranをVisual Basicへの書き変え方をご教授お願いします。

REAL ShipDim(17)
'読み込みの時
  filename = 'c:\pbcal\pbcal\pushdata\'//'push04'
open (3,file= filename, status='old', &
& form='BINARY', convert='BIG_ENDIAN',err=930)
DO 10 J= 1,17
read(3) shipDim(j)
10 CONTINUE
     (中略)  '見やすいように簡略化しています。
CLOSE (3,STATUS='KEEP')
 
'書込みの時はopenは下記で、後readをwriteに変えただけです。
open (3,file= filename, status=pstatus,form='BINARY', convert='BIG_ENDIAN',err=940)

VBでTRYしたことの一例
    Dim dat() As Byte = New Byte(-1) {}
  Dim sr As System.IO.Stream = Nothing
  Dim br As System.IO.BinaryReader = Nothing
Dim strf As String = filepath & "push04" 'filepathは適当にしている
   sr = System.IO.File.Open(strf, _
       System.IO.FileMode.Open, System.IO.FileAccess.Read)
br = New System.IO.BinaryReader(sr)
ReDim dat(sr.Length - 1)
dat = br.ReadBytes(sr.Length)

     dat に=572個の2-3桁の数字が入っています。encodingなどでためしてみたが文字化け
    ばかりです。
   (System.Text.Encoding.GetEncoding("****").GetString(dat) など)
     
  どうかよろしくお願いします。

Fortranのread/writeをVBへの書き換え方を教えて下さい。

他の方の作られたfortran.90のprogramをvisual basicに書きなおす作業をしています。その中の下記のfileのaccessが上手出来ません。このなかに有るbinary,とかbig_endianが原因のようです。
(これの無いfile accessの箇所は問題なく出来ました。)

program内でdataをfileに書込み保存して蓄積しているようで、後日このdataをreadして使うようになっていますので新しくfileを作り直すわけにもいきません。

いろいろとcodeを入れてみたが、結果は文字化...続きを読む

Aベストアンサー

FORTRANのOPEN命令の引数の意味が判らないのであれば、先ずそのFORTRANの取説あるいは文法書を見ないことには始まらない。
昔使っていたFORTRAN(VAX FORTRAN)には「form='BINARY'」や「convert='BIG_ENDIAN'」といったオプションはなかったので、
正確には判らないが、私の経験から

◎FORTRAN側
(1) FORTRANでのREAL変数は、4バイト実数です。(8バイト、又は16バイトの可能性もある)
(2) ファイルを'BINARY'指定でOPENしているので、ファイルに書き込まれているデータはバイナリ形式(メモリ内部形式)と推測できる。
(3) ファイルを'BIG_ENDIAN'指定でOPENしているので、ファイルに書き込まれているバイナリデータはビッグエンディアン形式と推測できる。
※ これは非常に厄介な状態です。なぜならWindows系の言語ではリトルエンディアンが普通なので、バイトの順番を入れ替えて読まないといけない。

◎Windows側
(1) バイナリファイルなのでエンコードは関係ない。(エンコードはテキストファイルの時のみ使う)
(2) ファイルから1変数分の4バイトをByte配列に読込む。(FORTRANのREALのサイズにより8または16の可能性あり)
(3) 読みこんだ4バイトの順番を入れ替える。
(4) 4バイトのByte配列を実数に変換する。
(5) 2~4をデータの個数分繰り返す。

※ ただし、FORTRANのREALのデータ形式と、VB.NETのSingleのデータ形式が同じとは限らないので正しく変換できないかもしれない。
※ また、ファイルサイスが572バイトだと、読み込もうとしているデータとサイズが合わないのも気になる。

サンプル(ファイル名等は合わせてください)
  Dim fs As New FileStream("c:\test.bin", FileMode.Open, FileAccess.Read)
  Dim buf(3) As Byte ' データ格納用配列(REALが8バイトならbuf(7)にする)
  Dim fWork As Single ' 実数データ(REALが8バイトならDoubleにする)
  Dim readSize As Integer ' Readメソッドで読み込んだバイト数
  Dim i As Integer

  For i = 0 To 16
    readSize = fs.Read(buf, 0, buf.Length)
    Array.Reverse(buf)
    fWork = BitConverter.ToSingle(buf, 0)
    Console.WriteLine(fWork.ToString())
  Next i
  fs.Close()

FORTRANのOPEN命令の引数の意味が判らないのであれば、先ずそのFORTRANの取説あるいは文法書を見ないことには始まらない。
昔使っていたFORTRAN(VAX FORTRAN)には「form='BINARY'」や「convert='BIG_ENDIAN'」といったオプションはなかったので、
正確には判らないが、私の経験から

◎FORTRAN側
(1) FORTRANでのREAL変数は、4バイト実数です。(8バイト、又は16バイトの可能性もある)
(2) ファイルを'BINARY'指定でOPENしているので、ファイルに書き込まれているデータはバイナリ形式(メモリ内部形式)と推測...続きを読む

Q25 Jul 2014 をyyyy/mm/ddに

早速ですが
WEBクエリーで 下記の値が セルに取り出せます
Last Updated: Friday, 25 Jul 2014 06:00 PM
これを 他のセル と 比較するために yyyy/mm/dd に変換したいのですが
MIDで 取り出すと 曜日と月のスペル文字列の長さが一定でないので困っています。

何か方法は無いでしょうか

If Format(Mid(NKNY.Range("J213"), 15, 10), "yyyy/mm/dd") = Format(NKNY.Cells(10, 2) - 1, "yyyy/mm/dd") Then

Aベストアンサー

Split関数を使って文字列を分解する。

Qマクロ初心者です。実行エラー'91になります。 今選択しているシートのコード名と別シートwk1の

マクロ初心者です。実行エラー'91になります。


今選択しているシートのコード名と別シートwk1のコード名が一致かつ、コード名がCから始まるなら
処理っていうのは下の文です。
...
For i = 〜
If 〜
For j = 〜
If Cells(i,Tcode).Value = wk1.Cells(j,15) And Left(wk1.Cells(j,1).Value,1) = ”C” Then

'処理(あるセル情報によって、出力位置が違う)
if Cells(i,m).Value = 1 Then
wk1.Cells(j,8).Value = Cells(i,out)
Else
wk1.Cells(j,15).Value = Cells(i,out)

ここまでは、社内で既に動かしているコードなので間違いはないです。

今回追加したいのが、
さらに、
wk1のシートの、例えばO列かP列どっちかに必ず番号が書いてるので、
その値を同じシートのA列から検索して
その行に同じようにCells(i,out)の値を出力(上記のように、セル情報によって出力位置が違うようにする)したい場合、

Kline= wk1.Range(”A:A”).Find(wk1.Cells(j,Num).Row
or wk1.Range(”A:A”).Find(wk1.Cells(j,Num2).Row

そして既存の処理のとこに
wk1.Cells(Kline,8).Value = Cells(i,out)
をTrueとElseそれぞれにいれましたが

Klineへ格納の時点でエラーになります。

Orはif文でしか使えないのかなと思い、
ifとOrを使い、
Trueは
Kline = Rows.Count

としましたがダメでした…

どうかご教示願います。

マクロ初心者です。実行エラー'91になります。


今選択しているシートのコード名と別シートwk1のコード名が一致かつ、コード名がCから始まるなら
処理っていうのは下の文です。
...
For i = 〜
If 〜
For j = 〜
If Cells(i,Tcode).Value = wk1.Cells(j,15) And Left(wk1.Cells(j,1).Value,1) = ”C” Then

'処理(あるセル情報によって、出力位置が違う)
if Cells(i,m).Value = 1 Then
wk1.Cells(j,8).Value = Cells(i,out)
Else
wk1.Cells(j,15).Value = Cells(i,out)

ここまでは、社内で既...続きを読む

Aベストアンサー

>実行エラー'91になります。
エラー発生場所を書いて下さい。
コード全体が書いてない以上、こちらで試すことも出来ません。

>コード名がCから始まるなら処理っていうのは下の文です。
何を言いたいのか分かりません。

>今回追加したいのが、
追加前はどんなコードですか?

質問する際は
・何をさせるマクロなのか
・可能な限りコード全体
・エラー内容(これは書いてますね)
・エラー場所
のように整理して書いて下さい。

QSystem.Collections.Generic.Listのソートについて

お世話になります。vb.net2010で開発をしております。
System.Collections.Generic.ListにクラスをAddしたクラス変数をソートしたいと考えております。
コードを以下に記述します。

Dim list As New List(Of aaa)
Dim listWork As New aaa


' クラス変数に格納する
listWork.strA = "2015/02/01"
listWork.strB = "17:00"
listWork.strC = "タロウ"
' リストに追加する
list.Add(listWork)

' クラス変数に格納する
listWork.strA = "2015/02/02"
listWork.strB = "17:00"
listWork.strC = "ジロウ"
' リストに追加する
list.Add(listWork)

Public Class aaa
Public strA As String(日付型文字列)
Public strB As String(時刻文字列)
Public strC As String(任意の値)
End Class

このlistを日付型文字列でソートしたいのですが、いまいちうまくいきません。
sortメソッドはlistに実装されているようですが、使用方法が理解できていません。
実際にソートを行うことは可能なのでしょうか。
もし可能であれば、サンプルコードをご教示いただけますでしょうか。
恐れ入りますが、どなたかご教示いただければ幸いに存じます。

以上宜しくお願い申し上げます。

お世話になります。vb.net2010で開発をしております。
System.Collections.Generic.ListにクラスをAddしたクラス変数をソートしたいと考えております。
コードを以下に記述します。

Dim list As New List(Of aaa)
Dim listWork As New aaa


' クラス変数に格納する
listWork.strA = "2015/02/01"
listWork.strB = "17:00"
listWork.strC = "タロウ"
' リストに追加する
list.Add(listWork)

' クラス変数に格納する
listWork.strA = "2015/02/02"
listWork.strB = "17:00"
listWork.strC = "...続きを読む

Aベストアンサー

簡単な方法では,Comparisonを引数にとるSortメソッドを使います。
https://msdn.microsoft.com/ja-jp/library/w56d4y5z(v=vs.100).aspx

list.Sort(Function (x, y) String.Compare(x.strA, y.strA))

何箇所でも行うのであれば,IComaprer(Of aaa)を実装したクラスを用意して,そのインスタンスを渡すとよいでしょう。


ただし,元のプログラムでは,listに入っている要素が全て同じオブジェクトのインスタンスになっています。
Addする要素は,それぞれ別々にNewした要素にしないといけません。
現在のコードで,2回Addした直後にブレークポイントをおいて,listの各要素のフィールドの値を見てみるとよいでしょう。

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報