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が見つからない時は、教えて!gooで質問しましょう!

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

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

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

Qあるサイト(https://search.npb.go.jp/kanp

あるサイト(https://search.npb.go.jp/kanpou/)の認証画面に自動的にID/PASSを入力して、自動的にログインするようなプログラムを作りたいのですが、ID/PASSの入力は問題無く行えるものの、ログインの際にエラー(予期しない操作により、処理中にエラーが発生しました。再度ログインを行ってください。)となります。何が悪いのでしょうか?

【ログイン部分のプログラム】
ieTarget = CreateObject("InternetExplorer.Application")
ieTarget.Visible = TrueValue = KANPOU_ID
.document.Forms(0).elements("password").Value = KANPOU_PASS
.document.forms(0).elements.submit()

ieTarget.navigate("https://search.npb.go.jp/kanpou/")
Do While (ieTarget.busy)
Loop
Do While (ieTarget.document.ReadyState <> "complete")
Loop
With ieTarget
.document.Forms(0).elements("uji.model.4.value_userId").Value =KANPOU_ID
.document.Forms(0).elements("password").Value = KANPOU_PASS
.document.forms(0).elements.submit()
End With

あるサイト(https://search.npb.go.jp/kanpou/)の認証画面に自動的にID/PASSを入力して、自動的にログインするようなプログラムを作りたいのですが、ID/PASSの入力は問題無く行えるものの、ログインの際にエラー(予期しない操作により、処理中にエラーが発生しました。再度ログインを行ってください。)となります。何が悪いのでしょうか?

【ログイン部分のプログラム】
ieTarget = CreateObject("InternetExplorer.Application")
ieTarget.Visible = TrueValue = KANPOU_ID
.document.Forms(0).elem...続きを読む

Aベストアンサー

ループで探してしまいました。そうしたら、57でヒットしました。

> .document.forms(0).elements.submit()

ieTarget.Document.all.Item(57).Click

QRst.FindFirst "名称コード" & "=" & "'101'"

タイトルのコードでは問題ないのですが、 101 を文字変数にすると「抽出条件でデータ型が一致していません」のエラーになります。この場合シングルクオーテーションはどういう意味なのでしょうか。
どうすれば良いのでしょうか。

dim Vcode as string
Vcode = "101"
Rst.FindFirst "名称コード" & "=" & Vcode

Aベストアンサー

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます。
そこで、

rst.FindFirst "フィールド名 = 'xxx'"

このようにすればOKです。
次のステップとして、xxx の部分を変数を使ってやりたい場合。
単純に変数名に置き換えると、

rst.FindFirst "フィールド名 = '変数名'"

ですが、変数を、"" の中に記述すると、文字列として扱われますので、"" の外に
出してやる必要があります。
その場合、文字列と変数をつなぐためには、& を使います。

rst.FindFirst "フィールド名 = '" & 変数名 & "'"

で、このようになります。

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます...続きを読む

QDim x As Integer = 0

いつもお世話になっております。

只今、本に記載してあるソースコードを手入力しています。
標記のように入力したら、『コンパイルエラー 修正候補:ステートメントの最後』というエラーが出ました。

(1)このエラーは無視してもよいのでしょうか?
(2)そもそも、変数の宣言文の後ろに=0をつけている意味がわかりません。当方VB初心者です。

よろしくお願いいたします。

Aベストアンサー

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsugi.ed.jp/vba4graduate/vba_hensuusyokika.htm
ーーー
定数のConstであればこういう書き方はOK
Sub test01()
Const x As Integer = 0
MsgBox x
End Sub
ーーー
VB.NETでは、OK
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim x As Integer = 10
MsgBox(x)
End Sub
ーー
Javaでは可能であるようです
http://msugai.fc2web.com/java/var2.html
ーーーーー
>ろに=0をつけている意味がわかりません
宣言と同時に値を与える=初期化する

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsug...続きを読む

QVB6.0exeから.NETのDLLを呼び出した場合の実行時エラー’429’について

お世話になります。

環境はWindowsXPです。

現在、VB6.0のexeから.NETのDLLを使用する・・・というのをしています。

以下の手順を踏み、実行してみたのですがどうも上手く行きません。。。
(1).NETのDLLを作成
(2)COMとして利用するために、.NET 2003コマンドプロンプトから「regasm」コマンドにてレジストリに登録
(3)tlbexpコマンドで、タイプライブラリを作成
(4)VB6のプロジェクトから(3)を参照設定する
(5)VB6から.NETクラスを生成し、呼び出す
(6)プロジェクトをコンパイルし、exeを生成

この手順にて実行すると「実行時エラー'429'ACtiveXコンポーネントはオブジェクトを作成できません」という
エラーメッセージが出てしまいます。

windows updateをしてみたり、VB6.0のランタイムをインストールしてみたりしたのですが、
どうもダメみたいで困っています。

解決方法などご存知の方がいらっしゃいましたら、
ご教授いただけると大変助かります。

よろしくお願いいたします。

お世話になります。

環境はWindowsXPです。

現在、VB6.0のexeから.NETのDLLを使用する・・・というのをしています。

以下の手順を踏み、実行してみたのですがどうも上手く行きません。。。
(1).NETのDLLを作成
(2)COMとして利用するために、.NET 2003コマンドプロンプトから「regasm」コマンドにてレジストリに登録
(3)tlbexpコマンドで、タイプライブラリを作成
(4)VB6のプロジェクトから(3)を参照設定する
(5)VB6から.NETクラスを生成し、呼び出す
(6)プロジェクトをコンパイルし、exeを生成

...続きを読む

Aベストアンサー

Exeで使用しているiniファイルやtlbファイルを最新のに置き換えて、もう一度regasmコマンドで登録してみてはいかがでしょう。

Q'2465'指定した式で参照している'直線Aii'フィールドが見つかり

'2465'指定した式で参照している'直線Aii'フィールドが見つかりません。

入力されたテキストDELTUKIをiiにセットして直線Aii~Ciiに反映させたいです。
DELTUKIには0~12までのどれかがセットされて、00の場合には未可視、それ以外は
該当月の直線Aii~Ciiを可視化させたいです。
ですが、上記エラーが発生します。
どなたかご指南頂きたくよろしくお願い致します。
※.メイン画面の画像添付参照願います。
※.vba vb6 winXP
SetLowerLine:
With objrep
!直線103.Visible = True
!直線104.Visible = True
!直線105.Visible = True
!直線106.Visible = True
!直線107.Visible = True
End With
'Reports(stdocname)!直線103.Visible = True
'Reports(stdocname)!直線104.Visible = True
'Reports(stdocname)!直線105.Visible = True
'Reports(stdocname)!直線106.Visible = True
'Reports(stdocname)!直線107.Visible = True

Format ("00")
ii = Forms!メイン画面![テキストDELTUKI]
If ii = "00" Then
Else
objrep.Controls("直線A" & "ii").Visible = True
objrep.Controls("直線B" & "ii").Visible = True
objrep.Controls("直線C" & "ii").Visible = True
End If

'2465'指定した式で参照している'直線Aii'フィールドが見つかりません。

入力されたテキストDELTUKIをiiにセットして直線Aii~Ciiに反映させたいです。
DELTUKIには0~12までのどれかがセットされて、00の場合には未可視、それ以外は
該当月の直線Aii~Ciiを可視化させたいです。
ですが、上記エラーが発生します。
どなたかご指南頂きたくよろしくお願い致します。
※.メイン画面の画像添付参照願います。
※.vba vb6 winXP
SetLowerLine:
With objrep
!直線103.Visible = True
!直線104....続きを読む

Aベストアンサー

すみません、先日のこちらのご質問での回答者です:
http://oshiete1.goo.ne.jp/qa5770608.html

前回の回答2への補足の件のうち、「(2)」と「(3)」については
結局私では対処法の見当をつけかねたままなのですが(汗)、
本件についてだけはどうにかなりそうなので、回答をつけさせて
戴きます。

・・・というか、前回「"」を外すことを指摘した際に気づいて
いればよかったのですが、これも見落としていました(汗)
以下の部分を、下記のように修正してください。

【現在】
Format ("00")
ii = Forms!メイン画面![テキストDELTUKI]

If ii = "00" Then
Else
  objrep.Controls("直線A" & "ii").Visible = True
  objrep.Controls("直線B" & "ii").Visible = True
  objrep.Controls("直線C" & "ii").Visible = True
End If

【修正】
'変数「ii」に対して、Format関数で桁表示を指定
ii = Format(Forms!メイン画面![テキストDELTUKI], "00")

If ii = "00" Then
Else
  '「ii」を変数として使用するため、「"」は外します
  objrep.Controls("直線A" & ii).Visible = True
  objrep.Controls("直線B" & ii).Visible = True
  objrep.Controls("直線C" & ii).Visible = True
End If


・・・以上です。

これで、「テキストDELTUKI」に1桁の数字(「1」や「2」など)を
指定した場合も、「直線A01」や「直線A02」に処理が行われる
ようになると思います。

すみません、先日のこちらのご質問での回答者です:
http://oshiete1.goo.ne.jp/qa5770608.html

前回の回答2への補足の件のうち、「(2)」と「(3)」については
結局私では対処法の見当をつけかねたままなのですが(汗)、
本件についてだけはどうにかなりそうなので、回答をつけさせて
戴きます。

・・・というか、前回「"」を外すことを指摘した際に気づいて
いればよかったのですが、これも見落としていました(汗)
以下の部分を、下記のように修正してください。

【現在】
Format ("00")
ii = For...続きを読む


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

人気Q&Aランキング

おすすめ情報