VBAなんでも質問スレ Part2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
VBAを使った質問ならなんでもござれ 本来の対象であるオフィスアプリを操作する以外の話もOK ゲーム作り、Webアクセス、外部アプリの操作 COM(ActiveX)、Win32API、.NET Framework、DirectXなどなど VBAで実行するものであればなんでも質問してください VBAを開発環境としていろいろ作っちゃいましょう 前スレ VBAなんでも質問スレ http://peace.2ch.net/test/read.cgi/tech/1342087380/ 関連スレ Excel VBA 質問スレ Part36 [転載禁止]©2ch.net http://peace.2ch.net/test/read.cgi/tech/1419718732/ Access VBA 質問スレ Part1 http://peace.2ch.net/test/read.cgi/tech/1328536426/ VBプログラマ質問スレ(Ver.6.0 まで) part64 http://peace.2ch.net/test/read.cgi/tech/1393069842/ Excel総合相談所 118 [転載禁止]©2ch.net http://peace.2ch.net/test/read.cgi/bsoft/1430352555/ >>574 ありません。 Wordは手動でやるしかない。 Excelとは違いますから。 >>580 VBAでもその力業で出来るけどね。 でも読み取り専用推奨で保存する目的はそのメッセージを出すことにあると思うからそれをスキップするコードを書くべきかという問題もある。 >>582 すくなくともうちの環境では、ReadOnly:=Falseで書き込み可能で開いてるけど? その状態からReadOnlyRecommended = Falseにして保存したら、読み取り専用推奨は外れてるが まあうちの環境がかなり古いから最近では出来ない可能性もあるが それホントに推奨なだけなのか? >>586 じゃあ2010から出来なくなったんだな うちの2007ではできてるから ただそこの文書 Note The following example applies to Word 2003 and 2002: とか書いてあるな Last Updated: Apr 19, 2018 らしいけど、適用対象バージョンがよくわからんな ACCESSでオートルックアップクエリを使用したフォームでマスタにないものを入力した際、 フィールドとキーが一致しているレコードをテーブルで探すことができません。 と出ますが、マスタにないデータを入力しようとしたとき、上のメッセージを出すことなく、マスタ登録用フォームを呼び出すにはどうすればよいでしょうか?教えていただけると助かります。 スパークラインをVBAで挿入したいんだけど範囲指定のところがうまくいきません。 わかる方いたら教えてください。よろしくお願いします。 call cells(10 , h ).SparklineGroups.Add(xlSparkLine, "n5: n100") "n5: n100" のところなのですが、 range(worksheets(h).cells(14,5) , worksheets(h).cells(14 , G )) のようにして ワークシートごとの数値群をスパークラインにしていきたいのですが、、、 何か良い方法を教えてください。 よろしくお願いします。 質問 Outlook2010なのですが 受信トレイの検索(Ctrl+E)で「請求書」を検索するのと同じ動作を VBAにしたいのですがどのように記述すればいいのでしょうか ボタンに登録して使うつもりです。 OutlookVBAを使うのは初めてでしてお手引きをお願いいたします VBAで質問です 【前提】 ・デスクトップにフォルダA ・フォルダAの中に9月1日分のExcelファイル"0901"とマクロ作動用の.xlsmファイル 【したいこと】 ・フォルダAの中に9月2日分のフォルダ"0902"を作成 ・"0901"を開き、B2セルの2018/9/1を2018/9/2に書き換え ・フォルダ"0902"内にファイル名を"0902"にして保存 日毎のレポートのひな形を作ろうとしています あまり知らないながら書いてるのですがエラー出まくりで泣きそうです >>590 Application.Searchメソッド、もしくは Application.Session.GetDefaultFolder(olFolderInbox).GetTable(DASLクエリの引数) を使えば良いのでは >>591 悪いこと言わないから、手でやるか詳しい人に頼みなさい 複数のブックが同時に開かれている状態でのVBA処理には いろいろ面倒なところがあり、経験が必要 5ちゃんでサクっと説明できるものではない しかもフォルダ処理も伴っているので、エラー処理を含め きっちり作ろうとするとけっこうな規模のアプリになってしまうと思う >>591 thisworkbook.path\フォルダA\0901を開いてあとはブック名から指定して必要事項を書き換え。 ブック名を指定してsaveAsで thisworkbook.path\フォルダA\0902で保存。 蛇足だが、必要無くともブックもシートも常に指定した方が良い。 >>591 とりあえず作ったコードを晒せば色々添削してもらえるかと >>593 回答できないなら黙ってなよ おそらくやりたいことはこんな感じだろう。 0901ファイルを開いた状態で、9月2日当日にレポートを作成する前提。 0901ファイルを修正するという話だったからその通りにしたけど、本当ならここはテンプレートファイルから書き起こすようにするべきだと思う。 テスト実行してないので、エラーが出たらごめんなさい。 Sub CreateDailyReport Dim Report As Workbook Set Report = Application.Workbooks("0901") 'テンプレートから新規ファイルを作成するなら以下のように変える 'Set Report = Application.Workbooks.Open(テンプレートのパス) Report.Worksheets("Sheet1").Range("B2").Value = Format(Date, "yyyy/mm/dd") Dim PathString As String PathString = Thisworkbook.Path & "¥" & Format(Date, "mmdd") If Dir(PathString, vbDirectory) = "" Then MkDir PathString Report.SaveAs PathString & "¥" & Format(Date, "mmdd") & ".xlsx" Report.Close End Sub >>592 Application.AdvancedSearchして Searchオブジェクトを検索フォルダーにSaveするっていうことですかね 単純にVBAでCrtl+Eのクイックサーチ(?)する方法があればと思ったのですが 無理っぽいですね ありがとうございました 初歩的な質問でごめんなさい うまくできません If IsNumeric(myN) Then Range("A1").Value=Range("A1").Value + myN End If myNが1の時と2の時があるとしてセルA1の値を3にしたいのですが やってみると12っていう風に数字が並んでいってしまいます どうしたらいいでしょうか >>599 もしmyNがString型、あるいはObject型に文字列データが入っている場合は数値型に変換する必要がある Range("A1").Value = Val(Range("A1").Value) + Val(myN) でいいんじゃないかな >>600 String型になっていました 参考にしてもっと勉強します お付き合いくださりありがとうございました 超初心者です。 Googleの検索窓に「VBA」と入力する サンプルコード (https://vba-code.net/ie/set-value-to-textbox/ ) を実行してみましたが、 objIE.document.getElementById("gbqfq").Value = "VBA"のところで 「実行時エラー 424 オブジェクトが必要です。」となって動きません。 「標準モジュールに以下のコードを追加して」の意味が分からないので、 標準モジュールをどう書いたらよいのか、どこに追加したらよいのかわからず サンプルコードのみを実行しました。 どなたか親切な方、対応方法を教えてください。 難しいことはわからないので具体的にコードを書いてもらえると嬉しいです。 よろしくお願いいたします。 >>602 >>objIE.document.getElementById("gbqfq").Value = "VBA" objIE.Document.getElementById("lst-ib").Value = "VBA" >>603 ありがとうございます! できました!!! なんか分からないけど動いて嬉しいです! 頑張ります。 >>604 おう頑張れ!わからんかったらまたいつでも聞いてくれな! >>605 ありがとうございます! 同じことを別のホームページでしたくて、 URLと入力するところを変えてみたのですが、 実行時エラー438 オブジェクトはこのプロパティまたはメソッドをサポートしていませんとなって動きません。 ホームページは https://www2.smile-etc.jp/NASApp/etcmlg/MlgReq ;jsessionid=0001kXELRCuGax2mjI7VtXa12rz:15fqn57ku?gvlddpef=1011100000&mdwsetmb=1011120000の画面でしたくて、 入力するところは objIE.document.getElementsByName("Name1Kana").Value = "マイレージ"としてみました。 お時間あるときでよいので出来たらお願いします。 仕事で毎日同じような入力ばかりしていて自動化できるところをできたらいいなと思っているのですが、超初心者にはハードルが高くて難しいです 涙 ' getElementById("gbqfq") getElementById("lst-ib") 君は、この違いがわからないの? HTML, DOM, CSS, JavaScript とか知らないの? VBA には関係ないのだけど。 全言語・プログラミングに共通の話題なんだが HTML に書いてある、ID だよ ウェブページは、HTML(DOM), CSS, JavaScript で出来ている。 ブラウザでF12 を押すと、開発者ツールが起動するだろ これらを知らないと、ウェブ開発はできない! VBA とは、全く関係ない >>609 >>609 知識もないのに場違いな質問をしてしまいすみませんでした。ご親切にありがとうございました。 >>606 自己解決して、自動入力マクロができました!ありがとうございました。 VBAでできることはC#でもやることはできますか? それにしても、なんで、マクロはFunctionしかcall出来ないんだろうね。 無駄にFunctionを作らないようにと英語の本には書いてある。Subで済むもをFunctionにするなと書いてある。 なのに、マクロの仕様のために、無駄にFunctionをつくったり、SubをcallするだけのFunctionを作ったりしないといけないのは間抜けな仕様だと思うがどうだろうか? >>614 それもC#で可能 >>615 ちょっと何言ってるかわかんないですね >>616 マクロからSubをCallできないのは知ってますか? >>617 知らないです 私の知ってるマクロだとsubもcallできるので >>616 本当に? ワークシートからDLL関数をCallするためのインターフェースだけはVBAネイティブのFunctionとして書かなきゃいけないと思ってた ワークシートから直接C#ソースの関数をCall出来るってこと? >>615 SubもCall出来る というかSubは本来Subroutineのことを指すのでそもそもCallできなきゃおかしい あれ?エクセルは出来るの? アクセスは駄目なんだよ VBAしか使わない人間は、WinAPI使わない人間はSubしかCallしない。 なんでAccessはマクロからSubを呼び出せない仕様なんだろうか? ほんとに?MSのサイトに対処方法が書いてあったけどなあ。 仕事で使ってたmdbでエラー出まくってSubをFunctionに書き換えた記憶があるけどなあ 意味が分からん。 ExcelだろうがAccessだろうが当たり前にできる。 やり方間違えてるだけだろ。 lngRet = FuncA("何かの引数") Call SubA("何かの引数", "何かの引数2") これはできる。 SubでCallを省いた場合に SubA("何かの引数1", "何かの引数2") とするのは出来ない。 Callを省く場合は SubA "何かの引数1", "何かの引数2" とする。 >>627 AccessとExceの用語の違いが問題かもしれません。 Accessだとマクロのデザインビューで新しいアクションの実行→プロシジャーの実行を選択→プロシジャー名を指定という流れです。 ここでSubを入れるとエラーになり、Functionを入れると実行されます。 全く同じ動作でもSubだとエラーでFunctionだと実行されるという謎仕様のことです。 >>628 Accessマクロの「プロシージャの実行」機能は、Functionプロシージャに限ってアプリ経由でコールバックさせることができるっていう一種のリフレクション機能だから、仕様上Subプロシージャを呼べないのは当たり前 でも普通はVBAその他一般のプログラミング言語の話題でCallするとかコードを呼び出すとか言う場合、プログラムのコード中で他のプロシージャ(=メソッド)を呼び出すこと一般を指す AccessだろうがCallステートメントでSubを呼べないわけがない 全然話してる内容が違う MSの提示する対処方法 https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/runcode-macro-action から抜粋 >>[!ヒント] Visual Basic で記述した Sub プロシージャまたはイベント プロシージャを実行するには、Sub プロシージャまたはイベント プロシージャを呼び出す Function プロシージャを作成します。 >>その後、 RunCode アクションを使用して、Function プロシージャを実行します。 >>630 そうなんですか?Callという言葉の使い方が悪かったのですね。 Accessのマクロのプロシジャーの実行からSubを実行できないという表現が適切なんですね。 それにしても謎仕様ですね。いちいちCall_SubみたいなFunctionを作らないといけないなんて馬鹿らしいですよね。 Subを使うのを止めて戻り値を使わないのになんでもかんでもFunctionにしている人がいるのはこのあたりにも原因があるのでしょうかね。。。 C#やJavaなどの言語にはfunction相当の構文しか存在しないから、それに合わせてるだけかも サブルーチンというものは、マクロ上での繰り返し処理や重複処理が必要な場合に同じコードを何度も記載することを回避して、プログラムの再利用性と簡潔性とメンテナンス性を高めるためのもので一種の共通部品で呼び出して使えるためとても便利。 その代わり呼び出し側のコードが必ず必要。 たとえ1回しか使わなくても、機能ごとに分けて名前を付けることでコードの見通しを良くするという目的もある ・Accessのマクロの「プロシージャの実行」機能は要するに「関数を実行する」ことに重きを置いている機能なので、関数ではないSubプロシージャは呼び出せない。 ・「呼び出す」と「Callする」は意味が(あるいは受け取り方が)違うので下手に知ったかぶりしないこと。 >>638 関数という言葉の定義次第ではSub Procedureも関数の一種になるぞ あと、Accessマクロの実行機能に関する話題でマクロピッカーからプロシージャを直接選択して実行する操作を指して「呼び出す」とか「Callする」と表現する例は比較的稀だと思うぞ 数学的な定義だと関数は一対一の写像だから戻り値がないものは関数ではなくなってしまう 丸投げアウトソーシングとでも言えばいいのか >>641 その理屈だと、Function Procedureが戻り値なしの記述を許容していること、戻り値と全く論理的な二項関係がない処理をFunction Procedureの中に書けてしまうことを考えた場合、Function Procedureが果たして関数と言えるのかどうかということの方が怪しくなる それはプロパティとメソッドについても言えるわけで。 意味合いから使い分ければ良い。 Accessの仕事してるけどいわゆるAccessのマクロ機能は嫌いなので殆ど触ったことないな。 >>640 マクロからVBAプロシジャを実行するのを、呼び出すと言うのはすごく一般的だとおもうが むしろ呼び出す以外にどう言うんだ >>642 戻り値を指定しないFunctionだって戻り値はちゃんとあるんだが まあそもそもプログラミング上でいう関数は数学的定義の関数ではないんだがな >>643 一般的なプログラム用語としてはそうかもしれんが VBAや旧VB,VB.NET,C#なんかはプロパティはメソッドとは別な構文で定義されてる VBAの話するならちゃんと区別しれ vba初心者でわからないところがあって質問したいんですけど、ここで大丈夫ですか? ExcelとAccessは専門スレが別にあるけどな >>647 その宿題をやるには「フォームの作成」という作業が必要で、それは文章だけの掲示板じゃとても説明できない 二次方程式 VBAのキーワードでぐぐればそれなりに情報はあるよ 学校でExcelの課題出るのか 全員Excel入りのWindows機もってる前提なのか なきゃ学校にあるPC使うだけやんけ 変な事気にする奴やな >>653 商業科の電卓名人みないな奴は、もぅおらんのか VBAで3つ数値があった時、最大値を表示させたい時 下記URLのNo.4の回答のelseifを使ったものがありますが、 elseifを使わずにelseだけで表示しようとすると、 どのようになるのでしょうか? 宜しくお願いします ttps://oshiete.goo.ne.jp/qa/5352661.html 分かりづらそうなので追記で、下記のところです。 宜しくお願いします a = 10 b = 200 c = 30 Max = a If b > Max Then Max = b ElseIf c > Max Then Max = c End If Max = a If b > Max Then Max = b Else If c > Max Then Max = c End If >>658 ありがとうございます 試してみたいと思います そもそも657では最大値求められないだろ。 なぜ他の2つと比較してから決めないのか すいません、まだ初心者でまだ理解が追いついていなくて とりあえず最大値求めるにはこういう形...とかで覚えようとしてて....頑張ります 658でも最大値は求められない 試しに a = 1 b = 2 c = 3 で試してみるといい。Maxが2になってしまう Ifだけでやる場合の正解の一例 Max = a If b > Max Then Max = b If c > Max Then Max = c >>661 If Elseの構文は、最初のIfの条件が成立したらElse以降は処理されずEnd Ifまで飛ばされる つまり、 a = 1 b = 2 c = 3 だった場合、 b > Maxが成立したらc > Maxの部分は飛ばされてしまうからMaxは2のまま終わってしまう elseやelseifは先行条件でTrueにならない場合にしか実施されない仕組みなことを理解しましょう >>661 このレベルを形で覚えようとしている貴方にプログラミングは向いてない ID変ったかも知れませんが>>656 です 皆さんありがとうございます >>665 手痛いレスですが、出来るところまで頑張ろうと思います。プログラマーではないですが基本は覚えないと連携し辛い位置の役職のため頑張ります。 本当のプログラミング初学者なら仕方ない。制御構文なんてどの言語も似てるので、1つ覚えれば次は勘が効くようになるよ、長い目でがんばりなされ 最大値を求めたいならWorkSheetFunction.MAX使えば良いんじゃね? パニックを、5人がかりでやれば楽勝だろ、とか言ってるようなもの。 VBA初心者です。少し長くなってしまいますが質問です。 ・やりたいこと 1:現マクロ有効ブックのsheet1にフォームボタン設置する。 2:押すとC:\Users\Public\動物まとめ.xlsx をバックグラウンドで開き、その中のシート名"カピバラ情報"の E列4行目から5行目6行目...と、空白が来るまでの情報を取得しする。 3:現マクロ有効ブックに新しくsheet2を作り、その新シートのA1からA2A3...に取得した情報を書き込む。 現在のマクロは下記ですが上手くいかないです。 Option Explicit Sub practice() Dim i As Long i = 4 Dim fullPass As String 'セルのB3に C:\Users\Public\動物まとめ.xlsxと記述 fullPass = Range("B3") Dim wb As Workbook Dim Anothersheet As Worksheet Workbooks.Open fullPass Set Anothersheet = wb.Worksheets("カピバラ情報") Sheets.Add After:=ActiveSheet Range("A1").Select Do While Cells(5, i).Value <> "" i = i + 1 Loop Call wb.Close End Sub 上手く情報を取得できないのでアドバイスお願いします。 >>675 wbに何も代入されてない。 AnotherSheetへの代入もこけるはず。 AnotherSheetが正しく生成されたとしても、その後使用されていないから何かとってこれるはずがない。 >>675 fullpass じゃなくて、fullpath ね。 >>675 行列指定が逆? 5行目を右方向に評価してくような感じになってるけど、新規に作ったシートが対象になってるから、一周もループしてないよね? >>675 Cell値を取るときは、デフォルトにまかせずちゃんとプロパティ指定しよう。 >>675 バックで開いたつもりのブックに新規シート作っちゃってない? ブックのフォーカスを制御するとか必要かも。 ID変わりましたが>>675 です。 >>676 ‐>>680 遅い時間帯でありながら見てくださって ありがとうございます。 色々と不十分だったのですね。 指摘箇所を直したりして また報告しようと思います。 >>675 最初に注意すべきなのは、いきなりRangeやCellsは絶対に使うべきじゃないってこと。 ちゃんと省略せずにWorkbookやWorksheetから書くようにする。 しかしそれだとコ―ドが長くなるのでそのために今回のコードのように変数で受けるかWith文を使う。 以下はスマホ上で書いてるんで動くかは不明です。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる