トップページtech
1002コメント383KB

Excel VBA 質問スレ Part39 [転載禁止]©5ch.io

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2015/11/27(金) 20:36:45.35ID:9HV+ag/s
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0866デフォルトの名無しさん2016/02/12(金) 00:06:05.03ID:4EYM4HYY
こういう投げやりな質問は報酬制にしてほしいね
0867デフォルトの名無しさん2016/02/12(金) 00:22:05.65ID:NB9uA2aw
どのようにって
普通に書けばいいですね
0868デフォルトの名無しさん2016/02/12(金) 01:59:27.96ID:gunxxlb9
やりたいことを1つずつ調べなよ。
他のブックを参照する、特定のセルの値をとる、
1行ずつブックに値を書く、とかね。
0869デフォルトの名無しさん2016/02/12(金) 06:02:16.01ID:4KxhZPev
>>866
ちなみにいくらぐらい欲しいの?
こんなの報酬もらおうにも100円ぐらいの内容だと思うけど
0870デフォルトの名無しさん2016/02/12(金) 06:08:37.28ID:Fbay5uRw
用件聞いてサンプルデータ貰ってコード書いてテストして、
で、一日かかるかどうかだから二万円くらいじゃね?
0871デフォルトの名無しさん2016/02/12(金) 07:44:15.34ID:vUMz7FOm
プログラマの報酬って1行10円計算と違うん?
0872デフォルトの名無しさん2016/02/12(金) 08:41:10.25ID:eUWMATXs
>>869
100円ww

君のような事例が今のIT業界を作ってるんだなって改めて思ったわ。
0873デフォルトの名無しさん2016/02/12(金) 08:53:48.16ID:6JIdb1d4
>>869
5万円欲しい
0874デフォルトの名無しさん2016/02/12(金) 09:42:12.77ID:tdFcrErR
1人月100万だとすると1日工数で5万。
人月仕事って高いよな
0875デフォルトの名無しさん2016/02/12(金) 12:23:58.29ID:IOOvL8tC
以上、答えられない質問のかわし方でした。
0876デフォルトの名無しさん2016/02/12(金) 16:56:54.83ID:OpesMGU+
インデックスが有効範囲にないならという記述はできますでしょうか?

a(10,10)という配列があり

if a(10,t) > 50 then
のように使うとき、tが12とかだったらエラになりますが、これの回避の仕方をご教授お願いいたします。
0877デフォルトの名無しさん2016/02/12(金) 17:03:35.83ID:vtZ9jqP1
>>876
例外処理をする
0878デフォルトの名無しさん2016/02/12(金) 17:22:44.29ID:0HgA+kac
VBAってlinuxでもできますの?
0879デフォルトの名無しさん2016/02/12(金) 17:24:28.01ID:OpesMGU+
on error goto indexerror
のように作っておけばいいのですね。
勉強になりました!
0880デフォルトの名無しさん2016/02/12(金) 17:45:43.40ID:4KxhZPev
>>879
On Error は他に適当な回避策がないときや、
回避策があってもそれやるがメンドクサイ時とかに使うもんであって
配列の要素数なんて簡単に分るんだから
横着せずにちゃんと UBound と LBound を使って処理しようよ

If (LBound(a, 2) <= t) And (UBound(a, 2) >= t) Then
if a(10,t) > 50 then
End If
End If

のほうが良いよ
0881デフォルトの名無しさん2016/02/12(金) 17:45:50.42ID:Xj/79B1T
こんなところでウダウダしてないで、それを生かして社会貢献してください
0882デフォルトの名無しさん2016/02/12(金) 18:31:13.80ID:hlhHAQgj
>>878
可能
VirtualBox + Windows + Excel と言う構成で良ければ
08838232016/02/13(土) 19:38:51.24ID:EYTUo5+J
>>864
レス遅くなってすいません。

"日付"書式のセルの値をValueプロパティで取り出そうとすると
日付書式の制限(西暦100年1月1日〜西暦9999年12月31日:-657434〜2958465)
を超えるとオーバーフローする、という理解で正しいでしょうか?

Value2というものがあるということは知っていましたが、このようなときに使うんですね。
とても勉強になりました。ありがとうございました。

ValueよりもValue2の方が優れているように感じます。
今後Valueプロパティではなく全てValue2プロパティを使うことにすると何か問題ってありませんかね?
例えば処理が若干遅いとか・・・
0884デフォルトの名無しさん2016/02/13(土) 21:49:38.36ID:GDWv9XcG
>>883
処理速度はValue2の方が速い
0885デフォルトの名無しさん2016/02/13(土) 22:19:41.35ID:2d9oUeOe
「Value2」てもっと違う名前考えつかなかったのかね?
0886デフォルトの名無しさん2016/02/13(土) 22:41:26.61ID:f/VF2KeB
NewWindow2とか
0887デフォルトの名無しさん2016/02/13(土) 23:19:04.31ID:OylkXFzp
>>865

そのまま回答するのはめんどくさい。
https://www.moug.net/tech/exvba/0060037.html
を参考にできんじゃね。
0888デフォルトの名無しさん2016/02/14(日) 00:13:22.48ID:zC+zpx/w
valueとvalue2の違いは?
0889デフォルトの名無しさん2016/02/14(日) 01:10:16.92ID:fDQc/eCz
>>888
通貨型と日付のシリアル値が取得できる
それ以外の型では違わない
0890デフォルトの名無しさん2016/02/14(日) 01:11:01.50ID:zC+zpx/w
>>889
ありがとうございます
0891デフォルトの名無しさん2016/02/14(日) 01:34:20.60ID:AnW4+fzX
そろそろエクセルマクロもC♯になったりしないかね。
0892デフォルトの名無しさん2016/02/14(日) 01:42:46.28ID:zC+zpx/w
別の言語を学ばないといけなくなるのはNG
0893デフォルトの名無しさん2016/02/14(日) 01:43:20.90ID:UrOJS99m
Googleのスプレッドシートはjavascriptだったっけか
0894デフォルトの名無しさん2016/02/14(日) 02:06:30.53ID:SJCumIm8
仮に新しいコンパイラ装備するとなったら、今の風潮からするとF#辺りぶっこんできそうではある。
C系列ならBASIC系列よりよっぽど簡単に覚えられるからC#でもJavaでも大した問題にはならないんだが。
0895デフォルトの名無しさん2016/02/14(日) 05:49:53.65ID:RVpb+5w9
>>892
両方使えるようにすりゃいいだけ
0896デフォルトの名無しさん2016/02/14(日) 07:51:34.27ID:fDQc/eCz
VBAじゃなくてフルセットのVBが使えるようにすれば無問題
機能的にも速度的にも

ていうか、素直にVB使えばええやん
もしかして無料って知られてない?
会社のルールでインスコできないヤツはご愁傷様
0897デフォルトの名無しさん2016/02/14(日) 10:13:31.34ID:/e94Iuh/
i=i+1を書くのが嫌だ
0898デフォルトの名無しさん2016/02/14(日) 11:02:24.78ID:fDQc/eCz
インクリメント、ビットシフト演算子、符号なし整数型あたりは欲しいときがけっこうある
0899デフォルトの名無しさん2016/02/14(日) 12:29:32.95ID:qwowkzgX
VBだとVBAのようなVariant型は使えないんだっけ?
0900デフォルトの名無しさん2016/02/14(日) 12:43:28.94ID:SJCumIm8
>>899
VBAまでのバージョンだと仕様的に基本的なデータ型を別に扱わなければならなかったせいで、
Variant型が必要だったけど、VB.NETになって全てObject型で扱う事が出来るから廃止された。

という風にググッたら書いてあった。
0901デフォルトの名無しさん2016/02/14(日) 13:16:52.23ID:+WF+5Yyl
そのObject型配列にセル範囲データを簡単に突っ込めるならいいかも。
でも大幅な書き換え作業はやっぱりいやだな。いま出来ている事ができなくなる不安もあるし。
0902デフォルトの名無しさん2016/02/14(日) 19:29:42.13ID:I7Qc+kxz
array関数を使うとオブジェクト型の変数もその他もお構いなしに突っ込めるのは関数だからのようですが
ここだけsetの洗礼を免れるのは違和感があるんですが本当にいいんです?
func(obj1, obj2)
dim a
a = array(obj1, obj2, 1, "挿入")
set a(0) = nothing
a = array()
それとこういう場合のnothingし忘れたobj2の参照はどうなるんでしょうかね
0903デフォルトの名無しさん2016/02/14(日) 19:56:22.66ID:SJCumIm8
C系列の言語から入ってくるとVBAの特殊な環境に戸惑うというのは分かる。
でもなんで自分で実験すりゃ済む事を疑問として抱え込んだり、出来ないと思い込んでVBAの欠点だと騒ぐんだろう。
0904デフォルトの名無しさん2016/02/14(日) 20:03:05.35ID:Bsnhcx6p
>>902
>オブジェクト型の変数もその他もお構いなしに突っ込めるのは関数だから
ちがいます
要素がバリアント型なので普通の値もオブジェクトも格納できるだけです

Nothingし忘れはどうなるだろうな
配列の要素まで参照カウンタ減らしてくれるかな?
デストラクタ(Class_Terminate)にログ仕込んだクラス作って実験してみればわかるんじゃね
0905デフォルトの名無しさん2016/02/14(日) 20:08:24.25ID:viQJz0oS
下のように、あるモジュールで開いたメモ帳の装置番号をおなじモジュール内の違うプロシージャに引き継がせたいのですが、どうすれば良いのでしょうか。
変数ならprivate subを使えば良いようですが、ファイルの装置番号の引き継がせかたがわかりません。すみませんがお願いいたします

sub a()
open 〜input.txt output as #1
call b
endsub

sub b()
print #1
close #1
end sub
0906デフォルトの名無しさん2016/02/14(日) 20:22:40.85ID:0n9Q+x/K
>>905
sub(a)の上行に public 装置番号
とか宣言すればモジュール内で使えます

workシートのあるセルを使っても引き渡せます
0907デフォルトの名無しさん2016/02/14(日) 20:49:27.29ID:qwowkzgX
>>904
たぶん>>902はなぜ Set = と書かなくても格納できるのかを疑問視してるんじゃない?

バリアント型だから普通の値もオブジェクトも格納できるってのはその通りだけど、Set = と書かなくてすむ
別の理由を求めたいんだろう。
0908デフォルトの名無しさん2016/02/14(日) 20:50:38.97ID:qwowkzgX
>>903
>なんで自分で実験すりゃ済む事を疑問として抱え込んだり、出来ないと思い込んでVBAの欠点だと騒ぐんだろう。

ふつうは実験する前に規格があるからじゃない?
0909デフォルトの名無しさん2016/02/14(日) 21:10:13.27ID:1RrNJs8y
>>906
セルで引き渡します。ありがとうございました
0910デフォルトの名無しさん2016/02/14(日) 22:02:39.06ID:+EEU6IXV
>>902
> ここだけsetの洗礼を免れるのは違和感があるんですが本当にいいんです?
いいも何もマイクロソフトがそれでいいと思ったからこうなってるだけだしな。
元々Setが必要なのはデフォルトプロパティが紛らわしいから値の代入と参照の代入を区別する為だけど、
マイクロソフトはArray()関数の引数でデフォルトプロパティを使いたい場面はないと判断しだんだろ。
必要だと思えばそれなりの構文を用意してくるはずだ。

要するにそういう決まりだというだけで、何ら論理的な理由はない。
受けいれるか受けいれないかだけだ。


あと、必ず最後にNothingを代入するのはやめろ。
メモリの解放を人が管理するとかならず漏れがあるから言語側で面倒を見てくれているのだから
Nothingの代入を書く癖がつくと当然書き漏らしが出てくる。
そして、そのプログラムを見た誰かは当然「どうしてここだけNothingが代入されていないのか」
という無駄な疑問を抱く事になる。プログラム的にな何ら問題がないにもかかわらず、だ。
つまり、どうしても他人を混乱に落しいれたいのでなければ余計な事はするな。
Nothingは代入するな。
0911デフォルトの名無しさん2016/02/14(日) 22:11:05.23ID:Ahl3Hrvy
>Nothingの代入を書く癖がつくと当然書き漏らしが出てくる。

この前提が間違ってる
「万が一書き漏らした場合には他者がそのコードを見たときに混乱する可能性も有る」
という程度の話なら理解できるけど
0912デフォルトの名無しさん2016/02/14(日) 22:11:45.16ID:SJCumIm8
ループ内でNewする時は明示的にNothing入れないとメモリを圧迫していくから、
そこには注意する必要があるけどな。

最後にNothing入れたい変数を持つ一連の処理は可能な限り別関数にすべきだけど。
0913デフォルトの名無しさん2016/02/14(日) 22:13:39.02ID:+EEU6IXV
>>911
お前は万が一かもしれんが、普通の人は十が一程度なのだよ。
0914デフォルトの名無しさん2016/02/14(日) 22:28:57.78ID:LvmVag53
変数が使われなくなった時点で開放されるだろ
信じろ
もしメモリが開放されてなかったら馬鹿にしてもらってもいい
0915デフォルトの名無しさん2016/02/14(日) 22:46:01.63ID:Ahl3Hrvy
>>913
その程度の人物なら他人の書き漏らしにも気付かないから
結局同じ事だよ
0916デフォルトの名無しさん2016/02/14(日) 22:58:05.65ID:Bsnhcx6p
>>912
>ループ内でNewする時は明示的にNothing入れないとメモリを圧迫していく
軽く試した範囲では、新しいインスタンス代入した時点で、前のインスタンスは破棄されてるっぽいぞ
当然他に参照が無い前提だぞ

>>914
循環参照とかしてると、使われなくなった後も開放されないんだが
まあ、参照されてるわけだから、使われなくなっていないと言えなくもないが
0917デフォルトの名無しさん2016/02/14(日) 22:58:31.32ID:qwowkzgX
>>910
そういうことを推測すること自体おかしいよ。
言語仕様を規格化していないことは罪だ。
0918デフォルトの名無しさん2016/02/15(月) 01:13:01.96ID:akbmk0Ll
マクロで一通りのこと出来るようになったと思ってたけどここの話を見てると全然何言ってるかわからないわ
0919デフォルトの名無しさん2016/02/15(月) 06:37:55.70ID:Lkye5vJL
言ってる本人達も9割分かってないわw
0920デフォルトの名無しさん2016/02/15(月) 06:39:18.81ID:g9kiXg+i
分からずに会話し続けられるとかどんだけコミュ力高いんだよ。
0921デフォルトの名無しさん2016/02/15(月) 09:44:08.73ID:k3iqvbPm
FileSystemObjectを使うときは、
 Dim fso as FileSystemObject
 Set fso=CreateObject("Scripting.FileSystemObject")
のように「FileSystemObject」や「Scripting.FileSystemObject」という文字列を暗記しておかなければなりません。
さらに参照設定でMicrosoft Scripting Runtimeにチェックした方が便利だから
「Microsoft Scripting Runtime」という文字列も暗記しておかなければなりません。

でもなにごとも暗記するのはイヤです。
数か月ぶりにVBAを使うので忘れていることもあるからです。
これみんなどうしてますか?
いい方法はありますか?
0922デフォルトの名無しさん2016/02/15(月) 12:21:09.82ID:AOCHEijb
もう暗記しちゃったからそれほど困ってないけど、
タイピングする事自体が面倒なので、
よく使う文言をまとめて書き込んであるモジュールを用意してある
fsoの他にも
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
なんかも全部そこからコピペして使ってる
0923デフォルトの名無しさん2016/02/15(月) 12:36:11.74ID:4OF/mElP
>>921
いちいちググってコピペしてる
あまりにもよく使うやつは、自分の作った古いVBAのソースからコピペ
0924デフォルトの名無しさん2016/02/15(月) 12:52:54.34ID:Mj6OaY8K
>>920
× 分からずに会話し続けられる
○ 分からずに適当なことを言い合ってるだけ
0925デフォルトの名無しさん2016/02/15(月) 14:03:32.87ID:k3iqvbPm
>>922
いいことを教えてあげよう。
F2押してオブジェクトブラウザ出して
左のクラスの欄のApplicationをクリックすると
右の欄に使用可能なプロパティ/メソッド一覧が出て
その中にScreenUpdatingもDisplayAlertsもCalculationも含まれてあるから暗記やモジュール準備は不要になる。

そんな具合で、Scripting.FileSystemObjectやFileSystemObjectやMicrosoft Scripting Runtimeを
暗記しないで使う方法はありますか?
数か月ぶりにVBAやると必ず忘れてる。
0926デフォルトの名無しさん2016/02/15(月) 15:34:29.01ID:OsSn1sDv
>>925
一覧から選べれば良いのか?
いいことを教えてあげよう
ツール-参照設定で一覧にMicrosoft Scripting Runtimeはあるぞ
それを選択すれば、オブジェクトブラウザの一覧にFileSystemObjectはあるぞ
0927デフォルトの名無しさん2016/02/15(月) 16:27:37.25ID:AOCHEijb
>>922
綴りは全部分かってんの
ただ、それをキーボードから打ち込むのが面倒なの

application以降の3つとかは決まりきった並びで
ワンセットにしてるし、それぞれ一覧から選ぶより
まとめてコピペのほうが速いんだよ
0928デフォルトの名無しさん2016/02/15(月) 19:20:33.88ID:Lkye5vJL
>>925
忘れたらまたここで聞いてくれればいいじゃないか
そしたら俺はいつだってMicrosoft Scripting Runtimeと言ってやるぜ!
0929デフォルトの名無しさん2016/02/15(月) 19:45:18.94ID:yxxj5Zwg
参照設定は入力アシストが楽だけど一ファイルずつ設定しやきゃならんのがな
0930デフォルトの名無しさん2016/02/15(月) 20:13:33.20ID:g9kiXg+i
>>925
俺は関数名そのままのクラス作って内部でCreateObjectするようにしてるわ。

ScreenUpdatingとかもInitializeでそれまでの設定を記憶しつつFalseにして、
Terminateで記憶した設定を戻すクラス作って不意のエラーで停止しても大丈夫なようにした。割と便利。
0931デフォルトの名無しさん2016/02/15(月) 20:43:20.75ID:OsSn1sDv
まあ、VBAの言語仕様はもうそのままでいいとしても
VBEはもうちょっと進歩してほしいよな
0932デフォルトの名無しさん2016/02/15(月) 21:22:14.77ID:k3iqvbPm
>>926
参照設定の一覧は多すぎて探すのが大変。
FikeSystemObject使いたいときはMicrosoftで始まることを忘れてて
FikeSystemObjectで探そうとするけど見つからない。
ひさしぶりだと「Microsoft Scripting Runtime」ということはすっかり忘れてる。
0933デフォルトの名無しさん2016/02/15(月) 21:23:09.13ID:k3iqvbPm
>>928
職場だから2chは見れない。
実際、変なサイトばかり見てる人がセキュリティ部門から警告があって上司からかなり怒られてた。
0934デフォルトの名無しさん2016/02/15(月) 21:27:57.34ID:k3iqvbPm
IEを操作したいときも
DOMツリーを使いたいときの諸準備のコードも
暗記せずに思い出す方法はないものか?

・CreateObject("InternetExplorer.Application")
の暗記も大変。

・参照設定はどれにチェックすればいいんだっけ?

・すでに開いてるIEタブを取得するにはどうすればいいんだっけ?
CreateObject("Shell.Application").Windowsだっけかな?

とか数か月さわってないと確実に忘れてる。
0935デフォルトの名無しさん2016/02/15(月) 21:34:34.23ID:k3iqvbPm
>>930
それはどういうことでしょう?
具体的にお教え願えますか?
0936デフォルトの名無しさん2016/02/15(月) 21:45:53.14ID:akbmk0Ll
>>933
にちゃんって変なサイトなのか?
0937デフォルトの名無しさん2016/02/15(月) 21:53:54.62ID:g9kjW0Ge
Variantに入れられる「確実に無効とわかる値」ってないもんですかね?
変数をたプロシージャに渡して、何かが代入されるかもしれないけど、
戻ってきたとき無効値のままだったら代替の値を入れるという処理をしたいです。

EmptyやNullは意味ある値として代入されたかもしれないから使えない、と言う状況。
Private 宣言したユーザ定義型はVariantに入れられないし...
0938デフォルトの名無しさん2016/02/15(月) 21:54:32.39ID:g9kjW0Ge
× 変数をたプロシージャに渡して、
〇 変数を他プロシージャに渡して、
0939デフォルトの名無しさん2016/02/15(月) 22:11:10.90ID:Lkye5vJL
期待する値と違う型ならなんでも良さそうな気もするが
0940デフォルトの名無しさん2016/02/15(月) 23:08:47.52ID:t+u0tvIB
>>937
文字列で"これは無効だよーん"とか入れとけばいいんじゃないか?
0941937代筆2016/02/15(月) 23:18:02.57ID:k3iqvbPm
いや、それじゃ本当に文字列として"これは無効だよーん"を使いたいときにそれと区別ができないじゃないか。
09429372016/02/16(火) 00:11:21.73ID:H4lPH6nF
いろいろ考えたけど、絶対安全なのは無理そうなので妥協しました。
故意に狙ってやらないと代入されないような値を初期値にします。
0943デフォルトの名無しさん2016/02/16(火) 00:18:58.14ID:CDwErKdX
何が入る予定で何がイレギュラーとして想定されるのかよくわからないから答えようが
0944デフォルトの名無しさん2016/02/16(火) 00:25:27.71ID:H4lPH6nF
既存の関数群にVariant変数を渡す。
インタフェースが同等の関数がたくさんあり、色々なことをやっている。
どの関数を使うかは変わりうるし、関数自体他者によって追加されることがある。
つまり、こちらからはブラックボックスとして扱うしかないということです。
0945デフォルトの名無しさん2016/02/16(火) 00:51:59.74ID:iVtNN0Qi
もう一つ別の変数を用意して、それを無効フラグとして使えばいい
0946デフォルトの名無しさん2016/02/16(火) 01:27:30.50ID://sfpAqe
>>944
Notingって使えないんだっけ?
ならテキトーな空クラス作って、それのインスタンスがVariantの引数に設定されてたら
無効ってことでいいと思うけど。
0947デフォルトの名無しさん2016/02/16(火) 02:45:02.01ID:qOZul9Ny
>>937
そういうのは、別に用意したステータスやプロパティで判断するのが普通だよ
初心者はトリッキーなことをやりたがって困るといういい見本
0948デフォルトの名無しさん2016/02/16(火) 02:48:36.36ID:VbbVKCv+
そもそも変数値が無効かどうかなんて状況次第だろ
処理内容も書かずに何が無効かなんてわかるわけない
0949デフォルトの名無しさん2016/02/16(火) 03:22:04.47ID:iVtNN0Qi
そもそも、Ruby, Python, Groovy, Go など、
マルチ代入できる言語では、戻り値とエラー情報を、同時に返す

file, err := os.Open("ファイル名")

if err != nil { エラー処理 }
0950デフォルトの名無しさん2016/02/16(火) 03:47:15.71ID:vhaFMrWy
ふつうはEmptyを意味ない値として使うんだがな
意味ある値として代入されたらって言うなら、意味ない値を自分で定義するか
値で判断しないで別途フラグなり用意しないと無理に決まってるじゃないか
0951デフォルトの名無しさん2016/02/16(火) 04:11:20.91ID:IqEc+Y3y
ファイル名でブックをロードするする命令が全部エラーになってしまいます。

・VBAコマンド例
Workbooks("test.xls").Activate
Workbooks("test.xlsx").Activate
Workbooks("C:\test.xls").Activate

・エラーメッセージ
実行時エラー '9'
インデックスが有効範囲にありません。

EXCELのバージョンは2016です。
どうしても原因がわかりません。
どなたかお助け願えませんでしょうか。
0952デフォルトの名無しさん2016/02/16(火) 05:47:26.50ID:vhaFMrWy
>>951
Activateはブックをロードする命令じゃない
ロードされてない(開いてない)ブックをActivateはできないぞ

まずWorkbooks.Openで該当ブックを開いてからActivateしてみろ
0953デフォルトの名無しさん2016/02/16(火) 07:42:06.56ID:Z4rZSsSX
>>944
既存の関数群に、別なフラグも渡して、値を設定するよう書き換えてもらう。
...ってのは無理だろうなあ。
0954デフォルトの名無しさん2016/02/16(火) 10:02:57.33ID:aYsl0/Pb
そもそも empty が初期値とか未使用とか
そういう役目を持った値なんだから
それに別の意味合いを持たせようとする事が間違ってるんだよ
そんな関数設計する奴が悪い
0955デフォルトの名無しさん2016/02/16(火) 11:42:02.50ID:eXnnZzqM
>>954
「見つかりませんでした」とか
0956デフォルトの名無しさん2016/02/16(火) 14:26:11.65ID:IqEc+Y3y
>>952
ありがとうございます。助かりました。

Workbooks.Open "C:\Test.xlsx"
Workbooks("Test.xlsx").Activate
で通りました。

Workbooks("C:\Test.xlsx").Activateはダメで
Workbooks("Test.xlsx").ActivateはOKなんですね。
0957デフォルトの名無しさん2016/02/16(火) 20:36:53.85ID:Ram+/g8a
>>956

Workbooks.Open したら、その開いたBookがActiveになるから
その後のActivateには意味が無いよ
0958デフォルトの名無しさん2016/02/17(水) 15:20:18.67ID:6+bmS6GM
質問お願いします。
3、4時間かかるプログラムを毎日夜中に走らせたいのですが、今日初実験したところ、途中でフリーズしてしまい完了できませんでした。ESCでの中断もできず、タスクキルしました。

フリーズ回避とESC中断が確実に出来るようにしたいのですが、どういったものが原因にあるでしょうか?内容は
IEからデータ取得(計5回のみ)+データ加工といったものです。
何か小さなことでもいいのでアドバイスお願い致します。
0959デフォルトの名無しさん2016/02/17(水) 15:28:29.31ID:ZHMdTa0o
>>958
まず、ログを適宜出力して、どこで止まったのかを特定すること。
0960デフォルトの名無しさん2016/02/17(水) 15:55:03.95ID:BZc3HBMX
>>959
初めて知りました。ありがとうございます、やってみます!
0961デフォルトの名無しさん2016/02/17(水) 16:10:08.40ID:ZHMdTa0o
>>960
蛇足かも知れないが。

ログはファイルに出力すること。
ここ参照。
http://officetanaka.net/excel/vba/filesystemobject/sample06.htm

どこでログ出力するのかは、
・IEにアクセスするメソッドの前後(これが怪しい)
・各Sub/Functionの入り口と出口
・あと怪しそうな所の前後
0962デフォルトの名無しさん2016/02/17(水) 16:50:50.50ID:ev89C1lU
>>957
ありがとうございます。
ActiveなワークブックにActivateしても特に害とかは無いのでしょうか?
0963デフォルトの名無しさん2016/02/17(水) 17:11:02.35ID:wkre/nrC
>>961
同じページ見てました。
ファイルに書き出すところまでうまく行ってます!
もしかしたら、私の予想3、4時間が甘く、実際は6時間ぐらいかかってまだ正常に動いていたのをフリーズと勘違いしたかもしれません、、そこで中断が出来れば良かったのですが、出来ず、、
ブック保存も適宜加えながら改善してみます。
0964デフォルトの名無しさん2016/02/17(水) 17:23:45.29ID:ZHMdTa0o
>>963
あ、あと、DoEventsを適当な所に入れること。
これを最初に言うべきだったか。

参考ページ:
http://officetanaka.net/excel/vba/function/DoEvents.htm
(OFFICE TANAKAのGoogle Top率高杉w)
0965デフォルトの名無しさん2016/02/17(水) 17:55:29.76ID:Z4Qv/wn8
DoEventsの役割や存在意義について
どなたか詳しく教えていただけませんか?

Sleep関数と関連がありますか?それとも同じですか?
0966デフォルトの名無しさん2016/02/17(水) 18:11:29.39ID:ZHMdTa0o
>>965
DoEventsがないと、そのプログラムは「応答なし」になって固まってしまう。(実際は処理をしてるんだけど)
DoEventsを入れると、そのタイミングでWindowsのイベントを処理してくれる。
Windowsのイベントというのは、キー入力とかマウス操作とか。

以下のコードは合計100万回×100万回のループでいつ終わるかわからないけど、実行中もExcelの操作はできるし
マクロの終了ボタンも押せる。

Sub Sample()
  Dim i As Long
  Dim j As Long
  Dim k As Long
  
  Debug.Print "開始"
  For i = 1 To 1000000
    DoEvents
    For j = 1 To 1000000
      k = Rnd * 10
    Next
  Next
  Debug.Print "終了"
End Sub
レス数が950を超えています。1000を超えると書き込みができなくなります。