トップページtech
1001コメント350KB

Excel VBA 質問スレ Part32

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/10/07(月) 22:19:55.86
ExcelのVBAに関する質問スレです

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。

 VBAとは、『Visual Basic for Applications』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

前スレ:Excel VBA 質問スレ Part31
http://toro.2ch.net/test/read.cgi/tech/1376371376/

関連スレ:VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/
0797デフォルトの名無しさん2014/04/27(日) 19:50:23.93ID:R2zgl6Dy
>>796
動いたよ。
どのワークシートのCellsなのかが不明なのでは。
ValueかTextかは別に関係ないかな
For文の後ろは書ききれなかっただけ?

Sub Renketsu()
  Dim str As String
  Dim i As Long
  str = ""
  For i = 1 To 5
    str = str & Me.Cells(i, 1).Text & "▲"
  Next i
  MsgBox str
End Sub
0798デフォルトの名無しさん2014/04/27(日) 19:57:39.29ID:R2zgl6Dy
&使わないほうが速い

Sub Renketsu2()
  Dim str() As String
  Dim i As Long
  
  For i = 1 To 5
    ReDim Preserve str(i - 1)
    str(i - 1) = Me.Cells(i, 1).Text
  Next
  
  MsgBox Join(str, "▲")
End Sub
0799デフォルトの名無しさん2014/04/27(日) 21:29:59.52ID:SP8zGQAF
>>796
文字列を連結する時、「&」の前後のスペースは省略できない
ここだけは自動でスペースが入らなくて、自分で入れないとエラーになる
0800デフォルトの名無しさん2014/04/27(日) 21:48:27.57ID:SP8zGQAF
もっと厳密に言うと、入力を省略できないのは「&」の前のスペース
後ろのスペースは条件次第で省略できる
今回の質問では2箇所とも後ろのスペースが自動補完されるパターン

renketsu=renketsu&cells(i,1).value&"▲" ' エラーになる
renketsu=renketsu &cells(i,1).value &"▲" ' これなら大丈夫
0801デフォルトの名無しさん2014/04/27(日) 21:50:04.16ID:SP8zGQAF
>>797>>798では結果が違ってくる
0802デフォルトの名無しさん2014/04/27(日) 21:52:34.25ID:SP8zGQAF
ごめん、訂正
&の前のスペースも条件次第では入力を省略できるんだった
0803デフォルトの名無しさん2014/04/27(日) 22:03:23.28ID:rjAzuBFb
>>799
ありがとう!その通りでした。
「これなら大丈夫」の方でうまく行きました。

>>797
実行時ではなく、記述時のエラーなので、for文の後ろはまだ
白紙だったです。
丁寧にありがとう。
Textプロパティとか初見で勉強になりました。
0804デフォルトの名無しさん2014/04/27(日) 22:21:45.87ID:wIC7n1Em
他プックを開いて
そのブックにあらかじめ書かれてある標準モジュールにあるSub(例えばSub TestProcesure()としよう)を実行させるためには
どのようなコードを書けばいいですか?
0805デフォルトの名無しさん2014/04/27(日) 22:44:24.66ID:wIC7n1Em
ふと疑問に思ったのでござるが
Subプロシージャと、戻り値のないFunctionプロシージャって、全く同じじゃないですか?どうですか?
0806デフォルトの名無しさん2014/04/28(月) 00:51:25.50ID:Z51g+zsH
>>805
何を比較して「同じ」とするか、定義による
ソースはもちろん違うから、同じとは言えない
Pコードが同じかどうかは調べてみないとわからない

代用できる可能性は否定しないけど使い分けた方がいい
適切な使い分けがされていないコードを相手にするのはめんどくさいしバグの元になるから
0807デフォルトの名無しさん2014/04/28(月) 20:44:15.96ID:PUbQSUbx
そもそもVBAに「戻り値のないFunctionプロシージャ」なんてない
戻り値の型を書かなくても値は返せる。たんにVariant型の指定を省略しただけ

Function test()
test = "test code"
End Function

このプロシジャは問題なく呼び出せる
0808デフォルトの名無しさん2014/04/28(月) 21:12:30.39ID:PUbQSUbx
>>804
Workbooks.Open "\test.xlsm"
Application.Run "test.xlsm!TestProcesure"
0809デフォルトの名無しさん2014/04/28(月) 23:31:36.81ID:+P6rwUoP
>>807
ふと思ったのでござるが
それが可能ならふつうのSubプロシージャを使ってたところを
そのままFunctionにかえても何ら問題なくマクロは動くってこと?
0810デフォルトの名無しさん2014/04/28(月) 23:33:34.42ID:+P6rwUoP
>>808
なるほど。
ありがとうでござった。
0811デフォルトの名無しさん2014/04/29(火) 00:12:43.42ID:7Qss/xhP
>>809
ダメ

そら大丈夫なコードもたくさんあるだろうけど、ダメな場合もあるんで、
特別な事情がない限りはSubはSubのまま使った方が安全
0812デフォルトの名無しさん2014/04/29(火) 00:29:30.69ID:jGZw12rc
>>811
え?
ダメな場合って例えば?
0813デフォルトの名無しさん2014/04/29(火) 00:39:02.88ID:7Qss/xhP
>>812
ほれ、一番簡単なサンプル
mainを実行すると数字が表示される
次に Sub a を Function a に書き換えて、もう一度mainを実行すると表示される数字が変わる
つまりSubはFunctionに置き換えられないってこと

Dim x

Sub main()
  a (1)
  MsgBox (x)
End Sub

Sub a(n)
  x = n
  On Error Resume Next
  a (n + 1)
End Sub
0814デフォルトの名無しさん2014/04/29(火) 01:49:43.07ID:LXv8yqdQ
ふだんコピペはよくしますが
Excelではセルの内容のコピペをするとき
連続してコピーだけ、あるいは連続だけペーストだけ、というのを可能にしたいです。

ショートカットキーに関しては、そのままCTRL+Cと、CTRL+Vを割り当てればいいので簡単です。

機能に関しては、上で書いたのを読んでピンときて人もいると思うけど
コピーしたものはその順番で記憶され、ペーストするときは最新のものからペーストされていく、という仕様にします。

これを実現させるためにはどういうコードを書けばいいですか?
不明な点はエスパーしてください。
0815デフォルトの名無しさん2014/04/29(火) 01:51:28.23ID:LXv8yqdQ
[例]
東京、大阪、千葉と書かれたセルを3連続コピーして
別シートで3つのセルら連続ペーストすれば、千葉、大阪、東京、のようにペーストされる、という感じです。
0816デフォルトの名無しさん2014/04/29(火) 01:58:42.35ID:7Qss/xhP
>>814
そういうのをスタック方式という
わざわざ作らなくても、クリップボードをスタック式に拡張するフリーウェアが既にある
0817デフォルトの名無しさん2014/04/29(火) 09:33:17.01ID:LXv8yqdQ
>>816
そんなことを言っちゃ警察はいらんよ。

こうすればいいさ。

Public sClip(100) As String '100は適当な最大数
Public iClip As Integer
Sub sCopy()
iClip = iClip + 1
sClip(iClip) = ActiveCell.Value
End Sub
Sub sPaste()
If iClip < 1 Then
End
End If
ActiveCell.Value = sClip(iClip)
iClip = iClip - 1
End Sub
0818デフォルトの名無しさん2014/04/29(火) 14:06:35.48ID:LXv8yqdQ
ところで100としたところがオレがプログラミング哲学に反するところなんだが
これを動的配列かなにかを使用して改善することはできないか?

あまりないが100以上になるとエラーが出るところが気に入らない。
しかしモジュール変数の配列では動的配列がうまくできなそう。
0819デフォルトの名無しさん2014/04/29(火) 14:35:41.53ID:xkTOBPPn
リングバッファ(FIFO)にするといいよ
0820デフォルトの名無しさん2014/04/29(火) 14:55:03.30ID:/qylVqTc
>>818
100だろうが1000000だろうが、リソースが有限な以上どこかに上限はある
上限気にするなら上限に達してもエラーにならないように作れよ

ところで昔オフィスクリッポボードとかいうのが有った気がしたんだが、あれどこにいったんだろ
探してみたら、リボンの中にいまでもひっそりとあるのかw
0821デフォルトの名無しさん2014/04/29(火) 16:16:14.87ID:oddt27dL
>> 818
ReDim Preserve ,UBound あたりで何とでもなるだろう。
でも、そんな面倒なことせずに必要な次元数を固定確保して >> 820 に一票

>> 820
オフィスクリッポボード・・リボンの中にいまでもひっそりと隠れているよ(ホームタブの左下隅)
0822デフォルトの名無しさん2014/04/29(火) 16:16:57.58ID:AVYTmVui
プログラミング哲学w
0823デフォルトの名無しさん2014/04/29(火) 18:17:28.97ID:/qylVqTc
オフィスクリッポボードを操作すれば良いんじゃないかと思ったんだが
あれ、VBAから直接操作できないのか

さっさとなくせば良いのにw
0824デフォルトの名無しさん2014/04/29(火) 20:59:07.47ID:jGZw12rc
>>818
配列の替わりにコレクションかディクショナリを使えば?
0825デフォルトの名無しさん2014/04/29(火) 21:22:15.37ID:7Qss/xhP
「哲学」だとか寝言言うまでもなく、データ数不定なのに配列の決め打ちは確かに褒められたもんじゃない
「これぐらいあれば大丈夫だろう」が、過去どれだけひっくり返ってきたことか

今回のケースなら、どうせ人間の指の動く速さがボトルネックになるんだから普通にReDimでいいと思う
せいぜい16連射、どんなに余裕を見ても秒間数十回しか呼ばれないんだから、処理が多少重くても影響なし
0826デフォルトの名無しさん2014/04/30(水) 02:40:51.87ID:Whj7Eetj
これぐらいあれば大丈夫だろう

秒間数十回しか呼ばれないんだから、処理が多少重くても影響なし
は、別の話だろ

まさかReDim使えば配列は無限に大きく出来るとでも思っているのか?
0827デフォルトの名無しさん2014/04/30(水) 02:53:49.94ID:x00tEAYh
そもそもワークシートやセルの数が有限なんだから、スタックも無限である必要はない
しかし上限は簡単には決められないから、必要に応じて拡張するように作る
そのために処理が重くなるのは困るけど、今回は多少重くても問題ない
0828デフォルトの名無しさん2014/04/30(水) 03:27:22.99ID:Whj7Eetj
いやだから、配列は無限に拡張できると思ってるのか?
0829デフォルトの名無しさん2014/04/30(水) 15:19:07.78ID:Iw0O5ndu
ユーザ定義関数を作ってセルに自作関数を入れるとき、
そのセルのアドレス、というかrow数、column数を取得するにはどうしたらいいですか?
そのユーザ定義関数を定義するときのコードの中で使いたいんです。

まさか=MYFUNCTION(ROW(),COLUMN())みたいにして渡さないといけない?
08308292014/04/30(水) 15:29:17.91ID:Iw0O5ndu
おや、ユーザ定義関数では、CellsとかOffsetは使えない?

例えばそのセルの値だけ右に移動した先にあるセルの値を出力する関数を作りたいとき
rowとcolumnで渡して返り値をCells(row,column).Offset(0,Cells(row,column).Value)としても全く動かない。
0831デフォルトの名無しさん2014/04/30(水) 16:01:29.61ID:QkWVSK2H
>>829
Application.ThisCell.Address
0832デフォルトの名無しさん2014/04/30(水) 16:16:47.04ID:Iw0O5ndu
>>831
ありがとうございます。

ところでこのコードだけでもものすごく役に立ちありがたいのですが
それよりもさらに知りたいことがあります。

このApplication.ThisCell.Addressというのはどうやって調べたんですか?
こんなマレなコードは本屋で売ってるVBAの本なんかでは絶対に出てこない類のものです。
どうやって調べたのでしょうか?
そしてこのより詳しい機能はどうやって調べますか?

ちょっと調べたらApplication.ThisCell.Offset(x,y)でちゃんと他セルの値も取得できて便利です。
0833デフォルトの名無しさん2014/04/30(水) 17:41:55.57ID:bd35DGVT
n=5として、[C5:C16]の選択を次みたいに表したら、「修正候補:区切り記号」
みたいなメッセージが出て、その行が赤くなり、「:」の部分が選択常態になってる。

range("C"&n:"C"&n+11).select

↑これなんだけど、これ何が間違ってるの?
0834デフォルトの名無しさん2014/04/30(水) 17:44:03.34ID:Iw0O5ndu
Application.ThisCellのことが気になって夜も眠れません。
Application.ActiveCellとどこが違うの?

実に不思議なことに
普通のSubプロシージャとかではApplication.ActiveCellしか使えずApplication.ThisCellだとエラー。
逆にユーザ定義関数を書くところではApplication.ThisCellしか使えずApplication.ActiveCellは使えない。
機能的には全く同じものなのに。
不思議ですね。
0835デフォルトの名無しさん2014/04/30(水) 17:45:32.67ID:Iw0O5ndu
range("C"&n&":C"&n+11).select
にしないといけない。
0836デフォルトの名無しさん2014/04/30(水) 18:05:42.98ID:bd35DGVT
>>835
ありがとう。
それをそのままコピーして貼りつけたんだけど、なぜかまた同じメッセージが
出て、今度は「":C"」の部分が選択状態になってる。
どこか、別の行がおかしいのかな。

Sub a()

Dim i As Integer
Dim n As Integer

Worksheets(1).Activate
n = 5

For i = 1 To 3

range("C"&n&":C"&n+11).select

(以下、略)
0837デフォルトの名無しさん2014/04/30(水) 18:18:39.04ID:bIvK3JIl
>>836
>>799-802
range("C"&n &":C"&n+11).select
0838デフォルトの名無しさん2014/04/30(水) 18:47:49.29ID:bd35DGVT
>>837
おお、できた。ありがとう。
0839デフォルトの名無しさん2014/05/01(木) 01:54:32.40ID:tA55q8Iy
' 参照型変数sh1の参照渡しとsh2の値渡しとで結果が違うのが理解できません。
' 参照型変数を値渡しするsh2がNothingのままなのは何故なんですか。
Sub a()
 Dim sh1 As Worksheet, sh2 As Worksheet
 b sh1
 c sh2
 Stop
End Sub

Sub b(ByRef sh As Worksheet)
 Set sh = ThisWorkbook.Worksheets("Sheet1")
End Sub

Sub c(ByVal sh As Worksheet)
 Set sh = ThisWorkbook.Worksheets("Sheet1")
End Sub
0840デフォルトの名無しさん2014/05/01(木) 02:23:33.09ID:UMPLKQg9
>>839
変数「が」参照するのと変数「を」参照するのは別だから
0841デフォルトの名無しさん2014/05/01(木) 06:29:41.23ID:VQHKFgN+
ユーザ定義関数で他セルの値を計算に使って表示してるとき
他セルの値を変更してもすぐにはそのセルの値が反映されない問題は
どう解決しますか?
0842デフォルトの名無しさん2014/05/01(木) 06:47:21.36ID:9zM4+Fav
>>834
まったく知らずに言うけど、
ActiveCellは、ユーザがマウスでクリックしたなど、
今フォーカスを持っているセル

ThisCellは、フォーカスを持っていないが、
今書き込むなど、計算しているセル

だから、ユーザ定義関数は、単なる何かを計算する関数で、
Applicationオブジェクトとは関係がなく、
フォーカスイベントをもらえないのでは?

Application.ThisCellは、定数のように静的なプロパティで、
どの関数からでも、使えるメンバなのかも?
0843デフォルトの名無しさん2014/05/01(木) 15:43:23.17ID:C2Wy7tu3
なんでヘルプ見ないんだろ。
ThisCellと書いてF1キー雄だけなのに。
> Range オブジェクトとして呼び出されるユーザー定義関数が入っているセルを返します。
0844デフォルトの名無しさん2014/05/01(木) 21:05:28.24ID:8XTpF2p+
http://d.hatena.ne.jp/robbie21/20060821/1156193877
ここにある、複数のシートを結合するマクロを
xp+Office2000で使っていたのですが
win7+office2013に移行したところ、うまく動きません。
具体的には、ふたつ結合したところで終わってしまいます。
どこを直せばいいのでしょうか?
0845デフォルトの名無しさん2014/05/01(木) 21:28:28.93ID:UMPLKQg9
>>844
バージョンに依存する部分なんてなさそうだけどなあ
呼び出し方とか間違えてない?
0846デフォルトの名無しさん2014/05/02(金) 04:58:44.30ID:AXfyvegw
>>841
Application.Volatile
08478412014/05/02(金) 11:21:13.12ID:0Sm4zufH
>>846
おい、すごいじゃないか(笑)
今年一番感動した(爆)

それより知りたいんですが、こういう解法ってどうやって探し当てたんですか?
ふつうのVBA入門系の本には載ってないし
ヘルプでも、Application.Volatile→使用法の方向では調べられても、やりたい事→Application.Volatileの方向では、絶対に調べられないか困難だぞ。
0848デフォルトの名無しさん2014/05/02(金) 12:31:21.02ID:eSB12fTe
>>847
ggrks
>>832と同じ人?
0849デフォルトの名無しさん2014/05/02(金) 16:31:45.74ID:VTOLN4jY
>>845
xpからwin7は同じマシンで、呼び出し?使い方も同じです。
試しにより高性能なマシンでやってみたところ
xpのときよりも10倍ほど時間がかかるもののとりあえず完走しました。
2000のときは窓が一つで中に複数のファイルを開く形でしたが
2013のようにファイルごとひとつづつ立ち上がると負担が大きいんでしょうか。

マクロ自体に問題があるわけではなさそうなので別のマシンで使うことにします。
ありがとうございました。
0850デフォルトの名無しさん2014/05/03(土) 05:25:42.80ID:9Cuh0B7r
文字列で指定した関数を呼び出す方法ってありますか?
引数や戻り値はとりあえず置いておいて、シートに書かれた関数があれば実行して、無ければエラーメッセージを出力するような処理を作りたいです。
0851デフォルトの名無しさん2014/05/03(土) 07:59:55.44ID:W3aEO+Ug
他シートをActivateしたらそのシートでActiveCellになるはずのセルのアドレスを
そのシートをActivateせずに取り出す方法を以前発見したのですが
それはどういう方法ですか?
0852デフォルトの名無しさん2014/05/03(土) 08:19:26.49ID:ElKs5wH6
>>850
適当だしあんまり確認してないけどこんなのどうでしょう、バグったらごめんなさい
Private Sub Test()
Dim buf As Variant
Dim target As Range
For Each target In Selection
If target.Value = "" Then
Debug.Print "Error"
Else
'ここでセルに入力されたワークシート関数を実行・評価する
buf = Application.Evaluate(target.Value)
If IsError(buf) Then
Debug.Print "Error"
Else
Debug.Print buf
End If
End If
Next target
End Sub
0853デフォルトの名無しさん2014/05/04(日) 07:58:46.98ID:PkGldEjn
構造化してる変数が2つあるんですが
1つを他のもののコピーとしたいんですが
単に代入すると同一のものの参照となります。
そうじゃなくて構造体の全メンバの変数の値をコピーするにはどうするのが一般的ですか?
0854デフォルトの名無しさん2014/05/04(日) 08:03:57.92ID:PkGldEjn
Structure Student
Dim name as String
Dim age as integer
Dim sex as String
Dim first_time_sex_date as Date
End Structure

Dim student(2) as Student

student(1).name="Taro"
student(1).age=16
student(1).sex="Male"
student(1).first_time_sex_date="2012/7/7"

student(2)=student(1)
student(2).name="Jiro"

みたいにして変になる。
0855デフォルトの名無しさん2014/05/04(日) 08:15:17.54ID:PkGldEjn
VBAでIEを操作するとき
タブ(複数開いてる)でアクティブになっているページをgetするためには
どういうコードになりますか?
0856デフォルトの名無しさん2014/05/04(日) 08:41:36.79ID:v/jP7knV
>>853-855
http://toro.2ch.net/test/read.cgi/tech/1342087380/
0857デフォルトの名無しさん2014/05/05(月) 02:49:54.32ID:GlFHWnLl
配列を関数にByvalで渡すことが出来ないのは何故ですか?
VariantにすればByvalで渡せますが要素数が多いと速度が激しく遅くなるのは何故ですか?
この2つ調べても分からなかったので教えてください
08588572014/05/05(月) 02:50:19.74ID:GlFHWnLl
エクセル2002です
0859デフォルトの名無しさん2014/05/05(月) 02:55:31.79ID:GlFHWnLl
配列をVariantに入れた変数は配列の先頭番地を格納してるので
Byvalで渡すとき要素数が大きくなっても速度が遅くならないと思うんですけど
0860デフォルトの名無しさん2014/05/05(月) 03:33:06.97ID:uFaF33P2
>>859
任意の型の配列をVariantに代入した時、代入されるのはポインタ(番地)じゃなくて内容、配列全体が丸ごとコピーされる
だから配列のサイズに応じて処理時間も変わる

Dim A(100) As Integer
Dim B As Variant
B = A
MsgBox TypeName(B)

このサンプルの場合、代入後にBの型を見るとInteger(配列)に変わっている
0861デフォルトの名無しさん2014/05/05(月) 03:45:08.05ID:GlFHWnLl
>>860
Integer(配列)に変わっているという事は配列全体が丸ごとコピーされてる証拠になるわけですか?
じゃあ普通の配列がByvalで渡せないのは配列全体が丸ごとコピーされて
処理時間が遅くなるから使い物にならないという理由なのですかね
0862デフォルトの名無しさん2014/05/05(月) 08:56:42.69ID:uFaF33P2
証拠にはならんね
ちょっと調べてみたけど、簡単には証拠は示せなさそう

もっと厳密に言うと、Variantに配列を代入すると、もともとVariantには数値が1つしか格納できないので、
配列のコピーが作られた上で、その配列へのポインタがVariantに格納される
だからVariantの中身はポインタ、という理解は間違ってはないけど、そのポインタの先にあるのは
代入元の配列ではなく、新しく作られた配列になっている
配列を丸ごと新しく作るため、処理はそれなりに重くなるしメモリも消費する
証拠はないけど、そういう仕様

どうして配列がbyValで直接渡せないのか、理由はよくわからないが、たぶんスタックオーバーフローを防ぐためのMSのおせっかいだと思う
Variantに配列を入れた時は、配列の本体は別の所に作られてスタックはVariant本体の分しか消費しない
だから許容する仕様にしたんじゃないのかな
0863デフォルトの名無しさん2014/05/05(月) 18:06:25.33ID:/BaOb3+l
FSOについて質問ですが

Dim FSO As Object

Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile("\\PC2\os\test.txt")
.WriteLine Now
.Close
End With
Set FSO = Nothing

ネットワーク先のディレクトリに新規ファイルの書き出しを行った場合
ネットワーク先のPCが消えているとVBAエラーが発生しますが、このエラーを無視して
コードを停止させることなく続行させ続けるにはどうすれば良いのでしょうか?
0864デフォルトの名無しさん2014/05/05(月) 18:15:41.79ID:zTX2z7nm
ON ERROR RESUME NEXT
0865デフォルトの名無しさん2014/05/05(月) 18:23:09.75ID:/BaOb3+l
>>864
ありがとうございます!これは便利ですね。独学でVBAを勉強中ですが知りませんでした。。
0866デフォルトの名無しさん2014/05/05(月) 18:25:54.17ID:hthjFo5y
便利なのは便利なんだろうけどさ、その危険性ってのも判った上で使えよ
0867デフォルトの名無しさん2014/05/05(月) 18:51:57.18ID:zTX2z7nm
SleepとDoEventsの違いは何ですか?

*ちなみにSleepはPrivate Declare Sub Sleep Lib "kernel32" (ByVal dwmillsecounds As Long)と宣言してから使います
0868デフォルトの名無しさん2014/05/05(月) 19:02:52.67ID:eTvbwywS
逆に共通する事知りたいわ
0869デフォルトの名無しさん2014/05/05(月) 19:37:01.29ID:uFaF33P2
>>867
>>303
0870デフォルトの名無しさん2014/05/05(月) 19:38:31.76ID:zTX2z7nm
>>869
それオレじゃないか(ワラ
0871デフォルトの名無しさん2014/05/05(月) 20:03:01.60ID:rD1fSl2O
SubとFunctionが同じだとか言い続けてるバカもおまえだろ
文体と質問のアホさ加減が同じ
0872デフォルトの名無しさん2014/05/05(月) 20:05:33.73ID:uFaF33P2
Sleepはプログラムの実行を一時的に止める
DoEventsはメッセージループを処理する
0873デフォルトの名無しさん2014/05/05(月) 20:06:58.64ID:uFaF33P2
>>839あたりからも同じ匂いがする
0874デフォルトの名無しさん2014/05/05(月) 20:09:20.00ID:F7Zw8bMG
>>787 >>851 あたりも同じかな
0875デフォルトの名無しさん2014/05/05(月) 20:21:56.97ID:zTX2z7nm
また味わい深い質問を思いついたので堪能していただければと思います。
ではさっそく質問に移ります

いろんなソフトウェアの上のほうに
ファイル(F)、表示(V)・・・、ツール(O)、ヘルプとあり、たとえばファイル(F)の下には終了(X)とだいたい決まっています。

これVBAから現在立ち上げてるアプリをすべてオブジェクト変数にいれて
そのメソッドとしてキー入力をできるようにできる方法はありませんか?

たとえばメモ帳を
Appli(1)というオブジェクト変数にして
Appli(1).KeySend("FX")というコードを書けば
見事にメモ帳が閉じるような。

もちろん本題は閉じることではなくいろんなアプリを自由自在に操ることですが。
0876デフォルトの名無しさん2014/05/05(月) 20:43:36.05ID:iASqhGK2
>>875
VBAからと言うのが
APIも含めるという広域を意味しているなら
出来ないこともない。
0877デフォルトの名無しさん2014/05/05(月) 21:05:07.90ID:zTX2z7nm
>>876
含めましょう。
ではどうやるのでしょうか?
0878デフォルトの名無しさん2014/05/05(月) 21:31:26.89ID:uFaF33P2
ウィンドウハンドルを取得した上でキーボードやマウス、その他のイベントを直接送ってやればほとんどなんでもできるけど、
さすがにVBAの比率が低くなりすぎてスレチ
API関係のスレにでも行け
0879デフォルトの名無しさん2014/05/06(火) 09:50:23.96ID:Avr/JzZk
Excel VBAでこんな機能のプロシージャってつくれますか?

[引数] Webサイトページの一番上のバーに表示されてる「タイトル」
[返り値] なし
[機能] 現在開いてるWebページを全部調べて、引数の「タイトル」のものがあればそれをアクティブにしてタブなら前面に出してそれをオブジェクト変数に代入する。なければなにもしない。
0880デフォルトの名無しさん2014/05/06(火) 14:55:03.32ID:jl3/KWxA
できますん

はい、次のかた〜
0881デフォルトの名無しさん2014/05/06(火) 16:34:49.64ID:EF/hc8MQ
>>879
APIで可能
VBAでやる必然性なし
0882デフォルトの名無しさん2014/05/06(火) 16:48:53.58ID:WIbNvSPM
>>881
必然性?
0883デフォルトの名無しさん2014/05/07(水) 01:13:46.53ID:XHO24LnT
シートのCustomPropertyをVBAで設定して
シートを右クリックなどして見れるようにするにはどうすれば良いですか。セルとかコメントに出力する以外の方法でお願いします。
0884デフォルトの名無しさん2014/05/07(水) 01:37:28.97ID:uh4oWvq+
>>883
http://officetanaka.net/excel/vba/tips/tips122.htm
0885デフォルトの名無しさん2014/05/07(水) 01:56:01.55ID:XHO24LnT
>>884
各シートにこういうプロパティ画面を表示するにはどうやるのですか?
0886デフォルトの名無しさん2014/05/07(水) 11:11:46.79ID:aD6Um6cx
みんな なんでも知ってるな・・・
0887デフォルトの名無しさん2014/05/07(水) 13:35:40.93ID:w4bXJfpE
References.AddFromFile()でVBScriptの正規表現ライブラリを参照した後、
RegExpやMatchCollection型の変数を定義するとユーザー定義型未定義の
コンパイルエラーが出てしまうのですがどうしたらよいですか?
0888デフォルトの名無しさん2014/05/07(水) 13:39:29.10ID:uh4oWvq+
>>887
エラーが出る最小限のソース晒して
08898872014/05/07(水) 14:33:27.95ID:w4bXJfpE
Dim RefFile As String

RefFile = "C:\Windows\System32\vbscript.dll\2"
ActiveWorkbook.VBProject.References.AddFromFile RefFile
RefFile = "C:\Windows\System32\vbscript.dll\3"
ActiveWorkbook.VBProject.References.AddFromFile RefFile

Dim re As RegExp
Dim mc As MatchCollection

これだとコンパイルチェック前にライブラリがロードされてないから、
RegExp型やMatchCollection型が定義されてないってないなるのは当たり前ですが、
これを回避する方法はありますか? ライブラリロードだけを別マクロにして1度だけ
実行すれば良いんでしょうけど。
0890デフォルトの名無しさん2014/05/07(水) 14:58:46.92ID:uh4oWvq+
>>889
それはVBAでは基本的に無理
万能の解決策じゃないけど「CreateObject」「実行時バインディング」あたりで調べてみ
08918872014/05/07(水) 15:20:21.05ID:w4bXJfpE
>>890
ありがとうございます。ちょっと調べてみます。
0892デフォルトの名無しさん2014/05/08(木) 16:21:39.25ID:DqNc14pR
>>887
VBAで正規表現を扱うためのやり方をググるとこの辺がヒットするんだけど
それではアカンの?

VBAで正規表現を使う (1/3):CodeZine
http://codezine.jp/article/detail/1655

Office TANAKA - Excel VBA Tips[正規表現によるマッチング]
http://officetanaka.net/excel/vba/tips/tips38.htm
0893デフォルトの名無しさん2014/05/08(木) 16:45:09.21ID:UhAEWxzw
まさかと思うが事前に参照設定する方法を知らないわけじゃないよな?
なんかの事情でどうしても実行時に参照したいんだよな?
0894デフォルトの名無しさん2014/05/08(木) 17:19:41.49ID:WIVGkEtc
参照設定ってなんですか?
目的はなんで、それをやるとなにができて、どういうことが便利ですか?
0895デフォルトの名無しさん2014/05/08(木) 18:24:47.72ID:uOW3clqT
使用するパソコンが不定だとか、使う人が不定だとかで、説明する手間を省きたいんだろ
よくある話じゃないか
0896デフォルトの名無しさん2014/05/08(木) 21:10:31.28ID:JZCmTzL0
参照設定で愚ぐれ
■ このスレッドは過去ログ倉庫に格納されています