Excel VBA 質問スレ Part49©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512 !extend:checked:vvvvv:1000:512 スレ立ての際は一行目に !extend:checked:vvvvv:1000:512 と入れてスレ立てして下さい ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part48 http://mevius.2ch.net/test/read.cgi/tech/1494890685/ ※関連スレ VBAなんでも質問スレ Part2 http://mevius.2ch.net/test/read.cgi/tech/1432173164/ Access VBA 質問スレ Part1 http://mevius.2ch.net/test/read.cgi/tech/1328536426/ Excel総合相談所 126 https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured >>150 Application.EnableEvents = False で、eventを止める そうしないと >セル挿入→再計算→Worksheet_Calculate→ifがtrue→セル挿入→再計算→Worksheet_Calculate→ifが(略 が起こる Private Sub Worksheet_Calculate() Application.EnableEvents = False If Worksheets("sheet1").Cells(3, 20) > 4000 Then Worksheets("sheet1").Range("V4:AP4").Insert endif Application.EnableEvents = True End Sub >>151 ,>>152 的確な指示ありがとう!!(笑) すごいなここの人は >>149 別にいいよ、モジュールの一番上にそれを書くのを忘れなければ モジュールの一番上に書くのは153でしょ '2ちゃんねるの神様に教えてもらったコードです '神様ありがとうございます Option Explicit Sub foo() 〜 こんばんは。 困ってます。 先日作成したマクロが動かなくなりました。 作成した日は動きました。 (特定のフォルダをコピーしてリネームするだけの動きです。) プログラムを手動で実行したときは問題なく動くので、 プログラムの問題ではなさそうなのですが。 エクセルのセキュリティは、「警告を表示してすべてのマクロを無効にする」 にしています。 エクセルの再起動・PC再起動は試しましたが、だめでした。 C:\...Local\Temp\Excel8.0のMSForms.exdも消してみたりしましたがダメでした。 原因は何でしょうか・・・? スペック全然書いてなかった。 Windows8.1 Excel2013 です。 すみません。 書き込んですぐに自己解決しました。 コマンドボタンのオブジェクト名が違ってた・・・。 >>158 良いんだけどさ、最低限デバッグ出来るようになってくれ。 デバッグ始めにtypoを疑って問題ないと確認して、 さんざん調べてやっぱりtypoの時の脱力感 optionexplititをつけよう(typo) >>161 他人のtypoはすぐにわかるのになぜかわからない自分のtypo 初心者的な内容ですいません。 よければ教えてください。 1はなぜactivesheetでなくshが回答となるのでしょうか。 shがworksheetsとして定義されていないのになぜ、worksheetsとして考えられるのかわかりません。 --------- 次のイベントプロシージャはブックに新しいシートを挿入したときに実行される。 挿入されたシートのシート名を、ユーザーがダイアログボックスから入力した名前に変更させたい。 このとき、【 1 】に入る適切な命令を解答欄に入力しなさい。 ただし、シート名の重複などのエラー処理は省略しているものとする。 Private Sub Workbook_NewSheet(ByVal Sh As Object) Dim strSheetName As String strSheetName = InputBox("新しいシートの名前を入力してください") If strSheetName <> "" Then 【 1 】.Name = strSheetName End If End Sub Sh As Objectって何だよ。 Sh As Worksheetじゃないのか。 問題に突っ込んでもしょうがないけど。 スタンダード公式ページの模擬問題3に書いてありました。 問題がおかしいのでしょうか? >>164 新しくできたシートが引数Shで渡されている。 (ByVal Sh As Object)の部分。 Workbook_NewSheetのイベントプロシージャの仕様。 たいてい、どのイベントプロシージャも自分自身の参照を引数で渡されている。 ので、この場合、新しくできたシート自身を操作したければ 引数で渡ってきているShを操作すればよい。 挿入された新規シートが必ずActiveSheetだとは限らないんじゃない? イベントプロシージャに新規シートが引数として渡されるのだから、それを使うのが確実 ちなみに問題が As Object なのは間違ってない https://msdn.microsoft.com/ja-jp/library/office/ff821246.aspx?f=255& ;MSPPError=-2147217396 こういう仕様があったんですね‼ ありがとうございます。 スタンダード合格出来るよう頑張ります。 worksheetでもいいだろ、と思ったらエラーになった 確かにobjectであって、worksheetではない http://stamp-uploda.com/src/file7295.jpg ってかこれ、一体なんなんだ?参照だろうけど、中身が全くないobjectが渡されてる。意味がわからない ウォッチ式では sh.name はウォッチ式が不正です イミディエイトウィンドウでは ?sh.name Sheet4 とシート名が返ってくる なんだこりゃ?? >>171 ウォッチ式にsh.nameが指定されてる? shじゃ無くて? ためしに別の変数にShを突っ込んでみたら 中身が見られるようになった。 どっかで、オブジェクト変数は利用されるまで中身が入らないよ みたいな話を聞いたような・・・。 >>172 試してみたら、ウォッチ式でもイミディエイトウィンドウでもsh.nameはうまく取れた。 ウォッチ式のshは取れない。 なんかバグの温床になりそうで、このshあんまり使いたくないなぁ… 環境はwindows7 エクセル2010 vbaコード Private Sub Workbook_NewSheet(ByVal Sh As Object) MsgBox 1 'ブレークポイントを設定している End Sub ウォッチ式に sh sh.name を追加 shは図のとおり、変な状態になる。プロパティなどが表示されない sh.nameはシート名が表示される イミディエイトウィンドウは正常 ?sh.name Sheet5 http://stamp-uploda.com/src/file7296.jpg >>173 プロパティ(sh.name)を呼び出してみた後の状態 (メッセージボックスにはsheeet6と正常に表示された) やっぱりダメだった。 http://stamp-uploda.com/src/file7297.jpg なんらかの理由でウォッチ式が正常に機能してないだけならいいけど、正常な状態でこれだとどういう状況なんだろう >>174 Dim sheet as Worksheet Set sheet = Sh これをmsgboxの前に追加すると全部の変数がウォッチで見られると思う。 ググってみたらNewで作ったオブジェクトは初めて利用するまで空ですよ らしいので、新シートのオブジェクトは内部的にNewで作成している? Sh.nameが引けるのは何ででしょう? それよりも改行しないコードかく人は何を考えてコード書いてるのか気になる >>174 objectで受け取ってるからshのままでは何のクラスなのかわからないからどんなプロパティがあるかわからない Nameプロパティを指定したら Nameプロパティを持っているクラスとして解釈して Nameプロパティの位置を文字列として表示しただけ worksheetクラスのデフォルトプロパティがNameだからかな countプロパティとかとして解釈させたら想定外の値になると予想 >>178 VBAだけじゃなくて他のプログラミング言語C言語とかと共通の考え方 メモリ確保とかキャストとか >>164 1が実行されるまでの間にactivesheetが変わるかもしれないからactivesheetでは不正解だと思う 出来るだけactivesheetを使わない方が想定外の動作にならないと思う てかお前らそんなに一か八かでactivesheet使ってんのかよw これが通るけど、ウォッチ式には現れない 多分ウォッチ式の不具合だと思う そう考えないと気持ち悪くて仕方ないし疲れてきた・・・ Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Calculate MsgBox Sh.Index End Sub http://stamp-uploda.com/src/file7299.jpg >>175 sheetでもShでも見れるようになりました Shの参照をコピーしたのでインスタンスが生成されたのかな >>177 indexプロパティでも通りましたし Sh.Calculateメソッドでも通りました >>181 使ってないよ。sheetの指定はsetした変数を使ってる 昔はactive〜やselect〜を使ってたけどね >>182 worksheetクラスではないクラスのプロパティを指定したらどうなると予想する? 例えばRangeクラスのプロパティとか もしかしたらサイズとかを見ていてサイズが異なる場合はキャスト出来ないかもしれないど メモリ領域には値が格納されているけどそれをどう解釈するかはクラスが決まらないと特定できない >>183 Private Sub Workbook_NewSheet(ByVal Sh As Object) Debug.Print Sh.Range("a1").Address End Sub で $A$1 が返ってきたわ http://stamp-uploda.com/src/file7301.jpg 写ってないけどウォッチ式のshのプロパティは不明なままね ウォッチ式がおかしい以外考えにくい Private Sub Workbook_NewSheet(ByVal sh As Object) Dim obj As Object Set obj = sh MsgBox obj.Name End Sub これだと中身が見られないけど通る。 やっぱり>>183 の型キャスト説じゃないかなぁ。 ローカルウィンドウでも見られないし。 obj.Value = "aaa" で実行時エラーになる。 「ん〜何か知らないけどValueに入れるよ?あっねえわw」 ってことでは? .Nameや.Range().Addressはあったんで通る。 >>186 それはrange指定してないっす・・・ Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Cells(1, 1).Value = "aaa" End Sub で通ったよ >>184 Debug.Print Sh.Range("a1").Address ではなくて Debug.print sh.address だったらどうなるかって意図だったけど ためしたら実行時エラーになる これはtypename(Sh)を表示したらわかるけど Shという変数自体にクラス(型)に関する情報を持っているから 無理矢理Rangeクラスのプロパティを表示させようとするとエラーになる dim rng as Range set rng = Sh とかやっても実行時エラーになる 文法的にはエラーじゃないからコンパイルは通る VBAが型チェックしてバグにならないようにしていると思う 他の言語だとこれができるものもある >>187 ShがWorksheetクラスだっていうのが判ってるからRangeを指定するってわかるけど Objectクラスだったら何のプロパティを持っているかわからなくない? Objectクラスはすべてのクラスのスーパークラスだから何でも参照できる Sh as Objectと宣言されているShが実態はRangeクラスである場合もある その場合は、Sh.Value = "a"でも実行時エラーにはならない >>188-189 なるほど、意図が分かりました。コンパイルエラーになる意味もわかりました、ありがとうございます 以下の状態だと、shの型はobject/Sheet5としてウォッチ式に認識されます この「Sheet5」というのは何でしょうか? デフォルトプロパティでしょうか? Private Sub Workbook_NewSheet(ByVal Sh As Object) Dim sheet As Worksheet Set sheet = Sh Debug.Print 1 'ここでブレークポイント End Sub しかし>>175 がどうしてもわかりません object型をobject型に渡してもプロパティは分からない、それは分かります http://stamp-uploda.com/src/file7303.jpg object型をworksheet型に渡すと、ウォッチ式で見れるようになる、それがわからない http://stamp-uploda.com/src/file7302.jpg 全部のプロパティ・メソッド見たら全部一致してたからworksheetとしてコピーしますね〜ということ? >>190 Set sheet = Sh を実行した時点で、Sh = sheet = Worksheetクラスのオブジェクトと特定可能 なのでworksheetクラスのデフォルトプロパティを表示しているのではないか ウォッチ式にsheet変数も追加すると、そのタイミングで Shの他のプロパティも見えるようになった >>191 型キャストで Shがワークシートだと判明したので Shとsheetは同じ物なので 両方のプロパティが同じで表示されるのではと思うが。 詳しくはマスターにまかせる。 と思ったらもう回答されていた。 すごい勉強になった。 >>191 ウォッチ式の表示更新タイミングはその内容が特定されたときに 即座に表示更新されるとは限らない つまり表示更新されるよりもずっと前に表示すべき内容が特定されていた可能性もある activesheet使うのはworksheets.copy使うときぐらいだな 真面目に作るときは書式とか直で指定するように頑張るけど レコードセットをそのままシートに張り付けると、元の型を継承して数字のみのカラムも文字列として貼られるんだけど、さすがにどうしようもない? >>197 和は加算の結果を表す言葉 0を加算とか足す0じゃないと意味が違ってくる 因みにレコードセットの型はcolumnの最初の7行分のデータから推測されるとかだったと思うから 目的の型になるようにソートすればいいかも 関数の引数にbyval ws as Worksheetってやるとどうなるの? worksheetに対しては、byrefしか使ったことない オブジェクト型はbyval渡し出来ないんじゃなかったっけ? >>198 なるほどそうだぬ 「ゼロを一括して加算(D)すりゃいい」と言い直させてもらう もともと具体的に書かず曖昧な表現を目指していた >>200 できるよ。 メソッド呼び出しもそのオブジェクトに対するものとなる。 違いが出るのは代入(=)演算の意味だけだと思う。 >>199 たぶんプロシージャ内の set ws=hoge が引数に反映されるかされないかが変わってくる >>203 ありがとうございます。 時間あるときに試してみます! thisworkbookをoptionalな引数のデフォルト値にしたいんだけどできない 何かいい方法知りませんか >>205 確認せずに答えるけど、できないならOptionalのデフォルト値をNothingにして、 モジュール内で判断・分岐する If a Is Nothing Then Set a = ActiveWorkBook とか デフォルト値は定数式で、って言われるな デフォルト値を文字列にして"thisworkbook"、evalで…とか考えたけど2013持ってないから試せない そこまでしても読みにくくなるだけなので、素直に>>206 みたいに条件分岐させたほうが良いと思う 質問です。 ユーザーフォームをShowModal=Falseで表示しており、フォームを表示したまま、フォーカスをフォームからセルに移動することは可能でしょうか? cells(1,1).select や application.goto cells(1,1) ではフォーカスがフォームから動きませんでした。 >>208 昔やったことあるなぁ と思って試したら、仕様変更でできなくなってるっぽい http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one ;no=44929;id=excel 2010は無理だった >>209 回答ありがとうございます。 後出しで申し訳ないですがバージョンは2007です。 試せるのが明日になりますが、appactivate試してみます。 >>206 やっぱりそうなるか でもなんでできないんだろうインスタンスとして実体化されてないから? そんなことないよな >>211 コンパイル時点で決まってないからかな〜 >>209 AppActivateもApplication.Visible=Trueでもいけました! ちなみに以下のも試しましたが全部ダメでした。 ActiveWindow.Activate ActiveWorkBook.Activate ActivateSheet.Activate 2010以降だとWIN32APIとかでシートのマウスクリックを挟まないとダメかもですね。 >>213 良かったね 2007と2010でそんなとこに差があるとは驚いた ↑誤送信すまん。 Sh As Object Sh As Worksheet どちらでも動くのは分かる。 Objectにするのって、 どんな値が入るかわからないから、 Variantでいいやって考えるのと同じ? どんな値が入るかわからないコードってどんなコード? デバッグ用にエラーで分岐させた先とか? つっこむならせめて値と型の違いぐらい分かっていて欲しかったなあ >>218 普通にすまん >>219 あってもなくても一緒では? variantを書くのは「どんな型が入るか分からない」と明示する以外に利点があるのだろうか NewSheetイベントの引数の場合、Shには 「Worksheet オブジェクトまたは Chart オブジェクトが渡されます」 と書いてあるので どっちが渡されてもいいようにObjectなのでしょう 俺の書くVBAはVariantばっかりだけど問題ないよね? 書籍にさえ糞みたいなコードが平然と書かれてるVBA どんなコードだってヘーキヘーキ そもそも宣言しなくても特に問題はない vbaの型なんてやわらかすぎてあってないようなもん、死にはせん >>223 もちろんさ! ちょっと単体テストすりゃ全然平気! 唯一気をつけるのはNULLが来た時の扱いだけど、「NULLがあり得る」場合は結局避けられない問題だし ただこーゆー所でVariantプログラムって言うとなんやかんやめんどくさいので胸の内に秘めとくことをオススメする >>229 まあNothingが来れば気を付けなきゃいけないだろうけど、NULLはDBから読んだデータソースに含まれている場合が多いから。 She As Object Set She = New LoveDoll She.DressUp(MaidCostume) She.Attach(SilliconVagina) I.Fuck(She) I.FinishAlone() She.Detach(SilliconVagina) I.Wash(SilliconVagina) 5行目にSet her = She があればよかった NewSheetイベントの引数ShがObject型なのは、WorkSheetクラスとChartObjectクラスの両方でNewSheetイベントの呼び出しが定義されていて、実行時にしかShの型が決まらないからだと思うが Workbook.Sheets(Index)の戻り値がObject型なのと一緒 variantとかobject形はコンパイルエラーで止めてくれないからめんどい 今ちょうど使いたい場面出てきてるんだが二の足踏んでる 指定日(A)から現時点(B)までの経過時間をミリ秒で取得したい場合、 どのようにしたら上手く取れるでしょうか? VB.NETの時はGetTimeMillisecondsがあったので、(B-A).GetTimeMillisecondsで取得出来たんですが。 >>237 ありがとうございます。 GetTickCountも試してはみたんですが、システム稼働してからの時間だからか 自分では上手く取得できませんでした。 「指定日」(今回やりたいのは1970/1/1)からの経過時間をミリ秒取得するには どのようにしたら良いでしょうか? >>236 doubleに変換して計算してまた変換するとか >>238 どうせそんな長いスパンならミリ秒はなんちゃってでいいんでしょ Application.WorksheetFunction.RoundDown((Date - CDate("1970/1/1")) * 86400000 + Timer * 1000, 0) >>236 timediff()関数だかdifftime()があったはず datediff()だった ただ秒単位が最小だった Win32API の GetSystemTime( ) を呼び出して後は頑張って差を計算するなりすればいいだけでしょ そもそもソースがクソ精度のシステム時刻だからmsecなんてあてにならない気がする 直前にNTPで同期をとるとか? 指定日から当日までをdatediffの秒単位で取得して 当日からその時刻までをmsで取得して 足し合わせればいいんじゃね ミリ秒の精度が求められる操作をVBAでって嫌だなぁw 作成するファイルやデータの一意な命名、識別とかに使うんじゃないの だいたいでいいと思うわ 要件って喪前らは横浜のシューマイ屋さんか!!!! (´・ω・`)b Range("250").ClearContents !!!? その手があったか!! 今まで、真面目に名前を付けることしか考えなかったわ。 Dim Sh As Worksheet Set Sh = Thisworkbook.Worksheets("(´・ω・`)b") こんなのもありだな。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる