Excel VBA 質問スレ Part51
■ このスレッドは過去ログ倉庫に格納されています
スレ立ての際は一行目に !extend:checked:vvvvv:1000:512 と入れてスレ立てして下さい ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※関連スレ 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/ ※前スレ Excel VBA 質問スレ Part50 http://mevius.2ch.net/test/read.cgi/tech/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) 早速質問 今vbaでマップ使って とある表の集計を行なっております 一つのkeyに対しアイテムが複数あるので 配列で入れようと思ったのですがうまくいきません 何か良い方法はありませんか? Dim dic Dim a() redim a(1) a(0)="test1" a(1)="test2" Set dic = CreateObject("Scripting.Dictionary") dic.Add "key1", "アテネ" dic.Add "key2", "ベオグラード" dic.Add "key3", a msgbox dic("key3")(0) msgbox dic("key3")(1) マップをやめて配列「で」入れる って意味にとってたけど マップの中に配列「を」入れる って意味かよ アイテムが複数あっても同じkey 使えばいいんじゃねと思った いい言葉を見つけた Those who know don't talk. (知ってる人は教えようとしない) Those who talk don't know. (教えてる人はあまり知らない) 立て乙です。 自宅にエクセル環境が無いのでうろ覚えで 細かい間違いはあるかもですが、該当箇所以外はokという前提です 日本という名前のブック 各都道府県名のシート があるとき Dim Bn as Workbook Dim T as Worksheet Set Bn = Workbooks("日本") Set T =Worksheets("東京都") Workbooks("日本").Worksheets("東京都").cells(1,1) = "123" Bn.T.cells(1,2) = "456" を実行すると 上段は問題なく実行されて、東京都シートのセルA1に123が入力されますが 下段でエラーがでてしまいます。また Bn.Worksheets("東京都").cells(1,2) = "456" T.Worksheets("東京都").cells(1,2) = "456" のどちらでも動きました ブックもシートも両方変数で指定するとエラーになってしまうのでしょうか? ブックもシートもそれなりに切り替えるので、可能であれば別で指定したいのですが…… 心当たりがあればご教示いただけると助かります。 >>10 × Bn.T.cells(1,2) = "456" ○ T.cells(1,2) = "456" オブジェクトの操作は慣れが必要だけど、こういうもんだと思っておくれ >>10 Bn.Tだと workbookオブジェクトにTって言う属性や関数が無いからエラーになるのは当たり前 >>10 > Set Bn = Workbooks("日本") > Set T =Worksheets("東京都") ここは Set T =Bn.Worksheets("東京都") って書くべき 返答ありがとうございます。 やっぱり両方同時に変数指定はできないんですね…… 何というか、指定先が変わる度にセットするのは見づらいような感じがしてまして 明日何とか考えてみようと思います。ありがとうございました ●●●宇宙の外側に何があるのか?●●● http://jbbs.livedoor.jp/bbs/read.cgi/stud ▲y/3729/1069922074/84-87 この掲示板(万▲有サロン)に優秀な書き▲込みをして、総額148万円の賞金をゲットしよう!(*^^)v http://jbbs.livedoor.jp/stu ▲dy/3729/ →リンクが不良なら、検▲索窓に入れる! >>10 名前(Workbooks)が一致していればいいってものじゃない。 オブジェクト.メンバ という構文なんだよ。メンバとはそのオブジェクトが持っているメソッドとかプロパティとかのこと。 しかし Bn.T と書くと、オブジェクトとオブジェクトを . で繋いだことになり、これは意味不明なものになる。 コレクションかユーザー定義クラス使うかしたらいいと思うが >>16 質問者はオブジェクト.メンバの構文の意味が分かってなくてオブジェクトブラウザも見たことない人なんだろうな オブジェクトのメンバ名を指定してメソッド関数やプロパティ関数を呼び出すことで別のオブジェクトインスタンスのコントロールを取得しているんだってことが理解できてないんだろう >>10 >T.Worksheets("東京都").cells(1,2) = "456" これホントに動いたのか? WorksheetにWorksheetsプロパティとか無かったはずだけど 何がやりたいかよくわからんが とりあえずブック名とシート名受け取って該当Worksheet返す関数作ればいいんじゃないかと ワークシートchangeでtargetのA1が代わったらコードが流れるようにしてて、それ以外はexitで抜けてるんだけど、コードがセルに転記してて毎回changeの所に戻ってはexit、戻ってはexitで見辛いのはなんとかなりませんか? >>20 マクロの実行中に何度もセルに書き込みが発生する処理が美しくないので設計を見直す。 EnableEvents=False でイベント制御したらだめなの? SolverOk関数のEngineまたはEngineDescの引数の規定値って何でしょうか? >>24 俺の使ってるバージョンだとその引数が無いっぽいから分からんけど オブジェクトブラウザで表示させれば分かるんじゃね MP4ファイルのプロパティ値を取得するプログラムでエラーが発生してしまいます ★の箇所で「'NameSpace'メソッドは失敗しました:'IShellDispatch6'オブジェクト」のダイアログが出ます 参照設定Microsoft Shell Controls and automaitonを追加してもだめでした 解決方法がわかれば教えてください Private Sub CommandButton1_Click() Dim Shell, Folder Set Shell = CreateObject("Shell.Application") Set Folder = Shell.Namespace(range("A1").Value) ←←←★ >>26 こちらのサンプルでとりあえず動きましたお騒がせしました Dim FSO As Variant, SHell As Variant, Folder As Variant Set FSO = CreateObject("Scripting.FileSystemObject") Set SHell = CreateObject("Shell.Application") Set Folder = SHell.Namespace(FSO.GetFile(Songs(1)).ParentFolder.Path) Cells(1, 1) = Folder.GetDetailsOf(Folder.ParseName(Target), 0) エクセル2013を使用しています。 今、日付を手入力しているのですが、何かで見たのですが カレンダーから選択して入力できる機能があるのですがエクセルでもできる方法ないでしょうか? いろいろさがした所アクセスはできるのですがエクセルは標準でもなく カレンダーコントールなるものあるみたいですが、アクセスもインストールしていないので VBAマクロの中にもありません >>14 両方同時にではない。 Worksheetを変数に入れたということはブック情報も込みで入ってる。 だから便利なの。 Aブックのαシートを変数に入れてもその変数でBブックのαシートにアクセスできるわけじゃない。 君のBn.T式のやり方だとBブックのαシートにもアクセスできることになる。 それはBn.Worksheets(T)式と変わらない。 一方、もしBブックのαシートにアクセス出来ないのならBn.T式の意味が無い。 T式で良いわけだから。 >>27 動くのは結構なことだけどFSO無くてもファイル情報取れるよ。 他の部分で便利にFSO使ってるなら良いんだけどその部分だけ見たら無駄だよね。 Dim objShell As Object Dim objFolder As Object Dim objFItm As Object Set objShell=CreateObject("Shell.Application") Set objFolder=objShell.Namespace("C:¥Users¥Hoge¥Desktop") Set objFItm=objFolder.ParseName("fuga.txt") Debug.Print objFolder.GetDetailsOf(objFItm,3) 参照設定とか書いてるけど、それぞれの意味分かってる? CreateObjectってのは、その場で名前を元にオブジェクトを作成する。 だからコード書いてる間にはどんなメソッドやプロパティがあるか分からないからインテリセンスでの候補が出ることもない。 参照設定は使うオブジェクトを事前に指定することでオブジェクトの型とかメソッド、プロパティにアクセス(インテリセンス等)しやすくするためのもので、CreateObject使ったり、オブジェクトの型をObjectにしてるんだったら意味がない。 CreateObjectで生成出来ないのも有るし参照設定のがある意味上位互換だけど人にコードを提示する場合は参照設定するよう指示も書かなくちゃなんないからCreateObjectでの例が多いんだけどさ。 もちろん、参照設定したら動くようになるなんてことも無い。 Dim objShell As Shell Dim objFolder As Folder Dim objFItm As FolderItem Set objShell=New Shell Set objFolder=objShell.Namespace("C:¥Users¥Hoge¥Desktop") Set objFItm=objFolder.ParseName("fuga.txt") Debug.Print objFolder.GetDetailsOf(objFItm,3) 参照設定は極力しないほうが良いよね 参照設定を忘れてドハマリすることがたまによくある >>28 エクセルでも出来るんだけど非常に上級者向けなんです。 上級者でも自分で1から組めない人が多いんじゃないかと思う。 上級者って何?、お前の勝手な分類だろって言われればそうなんだけど。 >>28 エクセル アドイン カレンダー で検索すれば色々見つかるよ 使いやすいもの選べばよろし >>28 UserForm使えば簡単に自作できますよ。 年と月用のテキストボックスをつけて、年と月それぞれ増減させるために、スピンドルボタンをつける。 日付表示用のラベルを必要数用意。 年と月のテキストボックスの値に応じて、ラベルの表示を変更。 ラベルのクリックイベントで、年と月のテキストボックスとラベルのテキストを連結して、日付に変換。 ラベルのクリックイベントは、クラスでまとめれば、クリックイベントをたくさん書く必要もありません。 コードっていろんなパターンあってたくさん書いてると思うんだけど、コードの保管ってメモ帳?? >>36 エクスポートできるよ gitとかsubversionとか使えばいい 連投すまんが、セルを方眼紙にして、フォームの中に直線コマンド、円コマンド、角コマンド等CADみたいなそれぞれ押したらそれが、反映されて作画って出来る? >>38 できるかできないかで言うと出来る 各図形の位置に当るセルの背景色を変えれば良いだけ >>36 ブログ作ってそこによく使うコードを置いてある いつでもどこでも検索すれば出てくるので非常に便利 >>38 できるけどかなりめんどくさい cacooとか既存サービス使った方が良いと思う >>42 他に手軽な方法がないからUserFormで作れるようにしておくのが一番いいぞ。 vbのランタイムをインストールすればDateTimePicker使えるけど、Formでカレンダー自作しておけば簡単に使い回したり配布出来るから一個作っておくといいと思いますよ。 フォルダ1 ┗XXX29年10月.xlsx XXX29年11月.xlsx YYY29年10月.xlsx YYY29年11月.xlsx フォルダ2 フォルダN フォルダ1内に今月のファイルがあったらコピーして名前を翌月に変更して保存 これをフォルダNまで同じように処理する方法教えてください 年月の取得はユーザーフォームが理想ですが全く分らんので マクロ実行用ファイルのA1に年、A2に月入力して取得する感じを考えてます >>47 今月のファイルを探したいならDate関数使えば今日の日付が出るからそっからformatなりyearとmonthくみあわせるなりで取得すればいいからわざわざ入力させる必要がないね フォルダないのファイル名の取得ならググればいくらでも出てくるぞ 俺はfilesystemobjectを使うけど >>47 まずは最初の部分だけ 今年 = Format(Now, "e") 今月 = Month(Now) 来月 = DateAdd("m", 1, Now) 年 = Format(来月, "e") 月 = Month(来月) 変数に残す必要なかった 今月 = Format(Now, "ee年mm月") 来月 = Format(DateAdd("m", 1, Now), "ee年mm月") どうしてもカレンダー欲しいんだったらSysDateTimePick32使って頑張るだろうな。 面倒くさいけど他のコントロールもMSFormsを使わないウィンドウ作成もやったことある。 きちんとプロパティ作るの面倒くさいから使いたいものしか実装してないけど。 >>48 ファイル名取得にfilesystemobjectは激重だった気がする。 Dir関数で頑張る方がよっぽど速い。 これが原因でfilesystemobjectは使わなくなってしまった。 他では速いものもあるのに食わず嫌いになった。 >>52 処理対象のファイルのロングパスがDirの引数の字数制限を越えてるときはどうするの? たかがファイル名を取得するのに処理負荷を感じるほど重くなるとか考えられないな。 読み取り先が等速ドライブに突っ込んだCDだったとか、回線の細いNASだったとかなら分かるけど。 >>52 クラスにして使いやすくしてるならDir関数でもいいと思うけど生で使う気は更々起きねーなあれは めんどくさすぎる 早い遅いは環境次第だろう 何をしようとしたか知らんが なんかWindows10でマクロの挙動が安定しなくなったんだけど、そういうのある? >>58 語ってるつもりはないし、普通に機能としてあるのに使ってバカにされる筋合いもない vbaでクラス使うメリットあるの? 一応あるインターフェースは使い物にならないし、継承も使えないし、コンストラクタに引数も設定出来ない。 vbaでクラス使うメリット教えて >>61 たまにある 単体の処理してる間だけじゃなく、しばらくの間は状態を持っててほしいとき ごく素朴な使い方しか出来ないし、しようとも思わないけど そもそもクラスが必要になるほど大規模なコードを書く用途にVBAは向いてない、使うべきじゃない ちゃんとした開発環境を使え 会社が許可しないなら転職するか我慢するかの二択、あるいは出世して自分で規則を変えろ 仕事の能率がアップして利益が増えるんなら反対する理由はないだろ 不合理なことを押し付けてくる会社なら、転職も選択肢ってことだろ。日本語ダイジョブ? クラスを使うとシンプルに表現出来る場合がある。規模の問題では無い。 普通に使ってるとなかなか活用するイメージが湧かないけど、覚えておくと役に立つよ。 ここでも前に書いたけど、配列のラッパークラスとか、一度作ると便利よ コレクションだと微妙に取り回し悪かったりするからね これ以上はスレチかな >>68 そうだよね ただ、いちいちクラスモジュールを追加しなきゃならないから、使い捨てクラスをほいほい定義しづらい FileSystemObjectのファイル一覧取得が遅いのなんて結構有名な話だと思うんだが。 ハードディスクにあるファイル名全部取ってくるとかすれば分かる。 昔、どっかに比較してる所が有ったんだが見つからないな。 Win32APIが一番速かったがDirでもそんなに大きな違いは出なかった。 が、FileSystemObjectは糞遅い結果になってた。 そもそも自分で組んだら遅くてネットで調べたらやっぱり遅かったという。 クラスは凄く便利だが、無理に使う必要は無いと思う。 個人的には仕様を考えた段階でクラス使うのがぴったりと感覚で分かる。 そういう時以外は使わない。 >>71 そうなんか まあ、今んとこそんな大量のファイルのやり取りしたことないから体感したことなかったわ まあ、その辺使うにしても生で扱うよりクラスでまとめちゃった方が取り回し良さそうだがね その辺は好みなんだろうけどね >>64 まともな言語ならクラスを使うデメリットはないけどVBAのクラスは制限が多すぎて使う意味がない >>59 bit数の関係で安定しなくなったことはある >>61 多分、ない class使ったほうが見通しがよくなる場合はあるけど、 正直そんなに変わらんというか、めんどくさくなるだけの場合が多い気がする この流れで突然クソみたいな質問するの恐縮なのですが… 共有で使っているExcelのデータの行がランダムに大量に消える現象が起きてます 多分誰かがオートフィルタかけた状態でうっかり削除したんだと思うんですが、 消えた行に全く共通点が無いので「マクロにウイルスが付いたんだ!マクロやめろ!」って因縁付けられています まずVBAにウイルスを仕込むならともかく、VBAを使用しているせいでウイルスに感染するって無いですよね? あとこのコードに行を消すような要素があるか見てもらいたいです オートフィルタをかけるだけの簡単なコードなんで無いと思うんですが周りに誰も聞ける人が居ないので一応… 簡単な指示だけどすごく頻繁に使うので消したくないんです Sub filter1() Range("K2").AutoFilter Field:=9, Criteria1:="<>" Range("L2").AutoFilter Field:=10, Criteria1:="" Range("O2").AutoFilter Field:=13, Criteria1:="AA" End Sub Sub filter2() Range("K2").AutoFilter Field:=9, Criteria1:="<>" Range("L2").AutoFilter Field:=10, Criteria1:="" Range("O2").AutoFilter Field:=13, Criteria1:="" End Sub Sub filter3() If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData End If End Sub >>76 ウィルスに感染していて、セキュリティをsageているためにウィルスが実行されているというパターンなら考えられるが 其れ以前の問題として ・オートフィルタをかける ・全体をコピー ・ペースト(値として貼り付けなど) で行が減っている可能性のほうが高いと思う この仕様 、意外と知られていないんじゃないかなぁ >>78 それって別のシートやブックに貼り付けるときに可視セルだけ貼り付けられているという意味ですか? 別のブックやシートにコピーする事は無いと思うので可能性としては低い気がします… 試しにオートフィルタしながら同じシートに貼り付けようとしたら「コピー領域と貼り付け領域が違うため貼付できません」となりました >>76 まあ、自作マクロでウィルスどうこうはあり得ないわ コード見る限りでも、フィルターかけてるだけで値の操作はしてないしな まあ、フィルターかけっぱなしにならないようにブッククローズ時にフィルター解除すれば? >>79 >それって別のシートやブックに貼り付けるときに可視セルだけ貼り付けられているという意味ですか? そう >別のブックやシートにコピーする事は無いと思うので可能性としては低い気がします… そか オートフィルタならまずこれかなーと思ったけど、コピーペーストしてないなら違うかな フィルターで謎のデータ消失なら質問者の疑念通りフィルターかけたまんま範囲削除じゃねーかな ありがとうございます コードがおかしいわけじゃないなら良かったです 一応ここに貼ったコードはAAの部分に別の単語が入ってるだけで他は全て実際に使っているものと同じです クローズ時にフィルター解除するようにはしてなかったのでやってみます インターネットが壊れた!みたいなのはやめてください! エクセルの特定の行だけ消すウイルスとか笑えるわ まあ、バグ満載のマクロとかある意味ウイルスだけど ウィルスは簡単に作れるだろ。 リテラシー無い奴が増えたからウィルスとは何ぞ?という議論が必要かも知れんが。 ただ、ExcelよりはAccessとかのが簡単だから大丈夫なんか?と思ったことあるけど。 Application.VBE系のコードが動くようになってれば感染させるのは簡単。 通常、Excelではセキュリティ設定で動かないようにはなってる。 Accessには設定が無い。 WordやPowerPointはどうだったかな。 Application.VBE系ってのはコード書いてるエディタを弄るものでVBAでコードを追加出来る。 つまり自分自身のコードをHDD上の不特定なxlsファイル開いて追加すれば自己増殖出来るし、Auto_Open辺りを追加して次回誰かが開いた時に勝手に実行させることも出来る。 ついでにそのxlsファイルをメールに添付して、アドレス帳の適当な所に送ることも出来る。 少し書ける奴なら分かってるだろうからApplication.VBE系は動かない設定になってるだろう。 Application.VBE系は便利でGithubにアップしたり、VBAのバックアックしたり、コード取得してWinmergeに与えて比較したり色々利用してたけどVB.netのCOMアドインに移行中。 コンピュータウィルスって「操作している人間の意に沿わない動きをするプログラム」だったと思ったんだけど、 いつの間にか定義が変わったのか。 CDトレー開いたりマウスをランダムに動かすジョーク系もウィルスだったはずだから>>76 のもウィルスと言っていいと思ったんだが。 >>90 その定義だと世の中のあらゆるソフトはウイルスになるんじゃね バグはあるからな AndroidやiOSもウイルスになる >>90 その定義だとワームやトロイの木馬とウィルスが区別できないわけだが いくら今だとより広義に使われるとはいえ >>いつの間にか定義が変わったのか はそのままお前に返してやるよ >>91 バグは確か「論理的に正しくない結果をもたらす何か」みたいな定義だったと思う。 マシン内に虫が侵入して電気的にショートするのが語源だしね。 同じ定義で使い続けるとバグとウィルスがあやふやになるというのは時代の流れだなぁ。 >>92 ワームもトロイの木馬も、元々はコンピュータウィルスを感染させるテクニックというか、 媒介手順だったはずがいつの間にか独立してウィルスの親戚みたいな扱いになってるよなぁ。 >>94 もともと、「感染」しないものはウィルスじゃない いつのまにか独立したんじゃなくて、初めからちゃんと別物でちゃんと区別されていたんだが いつのまにかまとめてウィルスと呼ばれるようになったんだ 今じゃマルウェア全般が広義にウィルスって言われる始末 バグは語源は諸説あるが、作成者の意図にそわない動作 ウィルスは作成者の意図にそった動作するプログラム いくらなんでもそれを混同しないでくれ >>95 だからトロイの木馬もワームも単体ではウィルスじゃなかったんだよ。 言うなればコンテナみたいなものなんで、トロイの木馬型のパッチプログラムとかも可能だし。 たぶん想像している「定義づけられた時期」が違うせいで食い違ってるだけだな。 >>96 ??? 自己増殖しなきゃウィルスじゃない。 トロイもワームもウィルスじゃねーだろ。 プログラミングによる業務自動化絶対阻止マンがいて、ウィルスだろうがワームだろうが 題目はなんでもいいから邪魔しようとしている という妄想をした... ...疲れているようだ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる