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/ 配列数の制御がめんどいし 個々のデータ型も合わせんでいいし 感覚的な話になるけど、例えばA列、B列、C列には○と×が入っててD列には何かの名前が入ってる時に、A、B、Cの組み合わせが×、○、○の時のD列の名前を表示したいとするわな。 こういう場合は一行ずつ見て行って×、○、○の組を探すわな。 こういう場合はFor Next使うわな。 つまり普通の配列が感覚に合う。 一方、A1:F100の範囲の各セルで1つだけ○、他は全て×の時に○のアドレスを知りたいなんて時には見つかるまで全てチェックすれば良いわけで、どう見ていくかなんて関係無いわな。 こういう場合はFor Each Next使うわな。 つまり連想配列が感覚に合う。 >>438 そんなもん普通はvlookup使うわな。 >>439 ばーか。 感覚を例として挙げてることが分からないバカは黙ってろ。 もっと上手い方法があるだろうことは最初から分かってる。 順番を意識しないIteratorの感覚を説明してる。 コレクションにだって順番は実際はある。 しかしそれを意識しないような場合にぴったりということだ。 他人の回答の批判とかするほうがおかしいね 質問に対して自分の考えで回答すればいいのに 適当に批判してやらなきゃお前ら好き勝手に質問と関係ない事ばかり言うじゃん 批判してくれる奴に感謝しろよw 質問と関係ないこと言ってもいいと思うけどなんでそれが駄目なのかな? >>444 自分は質問と関係ない自分語りするけどそれを批判されるのは許せないってか? どんだけワガママに育てられたんだお前は ドカタ仕事の憂さ晴らしをここでやるのはやめてほしいと思うのです 汚い言葉を使うのは本人は無頼漢的にイケてるつもりかもしれないけど 側から見ると貧乏くさいのです accessの条件付き書式について質問です。 FormatConditions.Add(acExpression,, の後の式は変数を展開してくれないでしょうか? また、関数の呼び出しも出来ないでしょうか? 例えばmonth関数は呼び出して戻り値が得られるのですが、自作関数だと呼び出せなくて困っています。 解決しました。関数使えますね。変数はまだ試していませんが、たぶんダメでしょうね。 Includeのようなことはできないでしょうか? 参照設定ではありません。 現在、ユーティリティ関数を集めたxlamファイルがあるのですが、中身が膨れ上がってきました。 機能単位でファイルを分割したいのですが、 そうすると今まで参照設定でutility.xlam1つで済んでいたのが、 utility_picture.xlam utility_text.xlam utility_workSheet.xlam ... と、いくつも参照しなくてはならなくなります。 utility_xxx.xlamをすべてインクルードした1つのファイルを作り、 それを参照すればすべて使える、というようにしたいのです。 こういうことはできるでしょうか。 >>451 ひとつのxlamがいくつの標準モジュール、クラスモジュールを持ってるの? VBAでそんなに大きくなるイメージがいまいち湧かないんだが なんでも詰めこめばいくらでも大きくなるだろw どんだけ貧困なイメージ力だよw なんでも詰め込んで大きくなったならダイエットしろというアドバイスになるだろw >>451 そういう運用は良いのかという問題がある。 それぞれのアドインがバッティングしないのなら、そもそもアドイン1つに纏めるべきじゃね? カテゴリが別だからとか色々理由が有るんだろうけど、その理由がそのままいくつも参照すべきという理由になるだろ。 アドインを1つに纏めるべきかいくつも参照すべきのどちらかじゃね? >>457 ・プロジェクトエクスプローラが縦に長くなりすぎて使いづらい。 ・巨大なクラスになるとfacadeパターンを使って分割しているのですが、 その際に処理を委譲するクラス名にxxx_reader, xxx_outputter等つけています。 ファイルを分けられれば単にreader, outputterで済むのですっきりさせたい。 この辺が分けたい理由です。 触るのが久しぶりだったので忘れていたのですが、a→b→cで参照が連鎖している場合、 a→cの参照がないとaからcの関数を呼び出せないだけで、プログラム自体は動くんですね。 いくつも参照でやってみようと思います。 >>453 単一目的のマクロ(そのutilityを呼び出す側)はそれほど大きくならないのですが、 画像操作、データシート処理のラッパー、デバッグ機能など 汎用的に使える機能をutility一つにまとめて行ったら大きくなってしまいました。 この辺を別ファイルにしようと思っています。 どうせ使う時は全部必要なんだろw 無駄なことすんなw 使うときは割と全部必要ですが、細かく分かれていないと 機能追加やリファクタリングが面倒なんですよ。 モジュールをディレクトリ分けしてツリー構造にするような ことができれば一番いいんですが。 出来るかどうか知らんが 親のユーティリティで子を自動的に参照設定すればいいんじゃね たしか参照設定もVBAからいじれたはず Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean) Dim objMe As Recipient Set objMe = Item.Recipients.Add("domon@sapporotakusho.co.jp") objMe.Type = olBCC objMe.Resolve Set objMe = Nothing End Sub 検索すると出てくるこのプログラムだと、 再送しようとした場合、BCCが複数追加されてしまいます Outlookで自動的にBCCを設置するプログラムは調べたら乗っているのですが BCCに既に設定したいアドレスがあった場合は追加処理をしないというプログラムを追加したいです >>463 変数objMeを宣言している行の直前に以下の処理を追加 Item.BCCプロパティに設定されている文字列を取得して、その中にdomonなんたらっていうアドレスが含まれているかどうかをInStr関数で調べる 含まれていたらExit Sub ありがとうございます 間違えてメールアドレスそのまま載せてしまいました やってしまった… もう一度頑張ってみます VBAとPythonが併用できるのかな? 前例あるの? python入る言うてもどのバージョンかとかライブラリかとかアップデートはするのかとか色々課題あるだろ 質問なのですが、別表の項目から他の表の項目(セルの位置)にデータを飛ばしたいんですが、できますか? ×ご教授 ○ご教示 あと、見も知らぬ他人にタダで教えてもらうんならそれ相応の作法は必要じゃないのって、端で見てて思う >>472 もっと具体的にどんなのが作りたいか書いてもらわないと難しいです。 5列目を変更した時に同じシートの1列目を選択するようにしたい、とか。 あるいは、別のシートのA1セルを選択したいとか。 飛ばすといっても、そのタイミングが変更した時なのか、選択したときなのか、特定の数値が入ったときなのか。 こんな感じの表Aがあって、似たような表Bが別シートにあるんですけど、 表Aのセルの色を付けると同時にB表のセルのイロを変える または、セルの文字も一緒に持ってくる できますか? https://i.imgur.com/u3mc1ot.jpg できるけど、コード教えてもらって、それを標準モジュールなり、sheet1モジュールなりに書き写せます? それを使いやすいように改良できます? できるって書いたけど、色を変えるのをイベントにするのは無理だから、マクロをボタンに登録するか、何かほかのイベントに割り当てるかしないとダメだわ。 >>482 お忙しいのにみなさんありがとうございます ちょっと詳しく説明すると、こんな感じです 左のsheetの表は一項目につき3段、その3段目の情報で仮にA,Bが記載されてある色つきのセルの情報のみを抜き出し、右にある別sheetの表に反映させたいのです 分かりづらかったらすいません どのように組めば行けるのか、詳しく教えて頂くとありがたいです https://i.imgur.com/M5bti06.jpg おわび 御貴兄たち、何卒添削お願いします。変数colとかrowのほうが良かったな Const OFFSET_X = 1 Const OFFSET_Y = 1 Const BLOCKS_Y = 3 Const WIDTH = 6 Const HEIGHT = 6 Private Sub CommandButton1_Click() Dim src As Worksheet Dim dst As Worksheet Dim x As Integer, y As Integer Dim des_x As Integer, des_y As Integer Set src = ThisWorkbook.Sheets("sheet2") Set dst = ThisWorkbook.Sheets("sheet3") dst.Cells.Clear des_x = 1 + OFFSET_X des_y = 1 + OFFSET_Y For y = 1 + 3 To HEIGHT * BLOCKS_Y Step 3 For x = 1 To WIDTH If src.Cells(y, x + OFFSET_X).Value <> "" Or _ src.Cells(y, x + OFFSET_X).Formula <> "" Or _ src.Cells(y, x + OFFSET_X).Interior.ColorIndex <> xlNone Then 'エラー判定は無し src.Range(src.Cells(y, x + OFFSET_X), src.Cells(y, x + OFFSET_X)).Copy _ Destination:=dst.Cells(des_y, des_x) End If des_x = des_x + 1 Next x des_x = 1 + OFFSET_X des_y = des_y + 1 Next y End Sub これ色付き以外のセルにも文字列は入ってるんだよな? あー〜スマン >表Aのセルの色を付けると同時にB表のセルのイロを変える この仕様を見逃してたわ 見なかったことにしてくれ >>487 入ってます 欲しいデータは1色で統一されてますが ちなみに他に文字が存在しており、それらはほかの色で存在しています >>488 お手数お掛けしております ほんとにありがとうございます 色で判断をなくして、(条件で変えるので)>>483 に書いてある欲しいデータ4種類を転記させるものでも良いのですが、難しいでょうか パソコンで見たら見えた。 これ、変更したところだけ反映したいの? それとも、元表の3行目全てを反映したいの? というか、データだけなら=で結べばいいのでは? >>491 そこまでして見ていただいて申し訳ないです 三段目だけを反映させたいのですが、その手書きの表の列、行ともに結構長い表なのです 手っ取り早く一瞬で作れたらと思って質問した次第です Excel VBAスレいけば寄ってたかってみんなで教えまくってくれんじゃね?行けば? >>493 いまはゴキブリが湧いてるからあっちは行かない方が良さそう >>492 結構長いというけど、どれくらい? 数十列数十行くらいで、1回だけなら右にオートフィルして、行ごとコピペするのが早いと思う。 =で繋ぐだけなら1回やっておけば、あとは自動でかわる。 マクロでやるとしても、数式で=を入れればいいのか、値を持ってくるようにした方がいいのか。 表の範囲指定はどうするか? current.regionか、usedrangeか、直接指定するか。(元の表に罫線が引いてあるか、空欄があるかで変わってくる) 数式だって絶対参照、相対参照をきちんと意識して書けばRange=数式でアドレスに併せて変えてくれるから1回の代入で終わる。 以外と知らずに1セルずつ代入する人もいるけど。 >>495 3段目に毎回同じ文字がくるとは限らず、最低3種類の文字がくるので、とりあえずif分使って作成しました 横に日数1年分、縦に各項目50程です 絵にある通り、全く同じ表をコピペして使いますが(線あり)、ほんとは転記先の表は1段で済ませたい所でした 日替わりで最低3種類のうちのひとつが返ってきたらいいので わかりづらくてすいません >>496 そうなんです やり方を知らないので今は1セルずつ代入しています >>498 fast-uploader.com/file/7072682105190/ 目的のものと全然違うかもしれないけど作ってみました。 データの最初のセルだけは自分で指定してください。 >>499 乙です 老婆心ながらアップする前に「ブックの検査−ドキュメント検査」したほうがよろしいかと。 >>499 見れないのですが、消されたのでしょうか >>498 やり方も何も、例えばA1からA列に1、2、3、・・・と入力されてるとしてRange("B1:B10").Value="=A1"を動かしてみな。 全部A1を参照したいならRange("B1:B10").Value="=$A$1"とする。 本当はValueではなくてFormulaだけどValueでもちゃんと相対参照してくれる。 fast-uploader.com/file/7072704922415/ パス 0128 >>504 >>505 みなさん、無知ですみません ほんとに助かります ありがとうございます >>505 ひとまずダウンロード致しましたので明日内容を確認します お時間割いて作っていただいて、ただただ感謝です おやすみなさい 下から5行くらいにtext ってあるの、valueに直した方がいいかも。 textでも問題ないかもしれないけど。 おはようございます 昨日ダウンロードさせてもらったファイル開かないのですが、どうやったら開きますか? エクセルのバージョンは? 当方2013で開けましたよ。 >>509 2010です すいません、どうやって開きました? プログラマですがvbaの初心者です。 C,java,lisp,python 基本的な言語とその意味論はだいたい知ってます。 vbaで書籍を探すと、大抵業務問題の解決という文脈で本が書かれているようですが 純粋に言語的な機能を抽出した言語仕様、あるいはリファレンスに相当するものを求めています。 そのような書籍のうちもっとも簡潔に記述されているような本はないでしょうか? >>511 本職のPGならマイクロソフトのディベロッパーセンターの英語版リファレンスを直に読んだ方が良い あと、場合によってはVBAとほぼ同じシンタックスになってるVB.NET用のMicrosoft.Office.Interopクラス以下の各アプリケーションのオブジェクトのリファレンスの方が役に立つこともある VLOOKUP関数の応用で、2列のリストがあり、検索セルではどちらかを入力するともう片方が入力されるものをVBAで作りたいのですが、、、 >>514 左をキーにしてvlookup 、次に左をキーにしてvlookup すれば良いんじゃないか? 右と左に同じ内容が存在するとダメだけど。 グラフを作成するときにXValuesってすべての系列で統一しないといけないんですか? x1={0., 1., 2.}, y2={0., 1., 4.} x2={0., 0.5, 1., 1.5, 2.},y2={0., 0.25, 1., 2.25, 4.} みたいな2つの系列があったときにplot(x1,y1), plot(x2,y2)みたいに扱いたいのですがどうしたらいいでしょうか 特定のフォルダ内のすべてのブックにC列に複数存在する特定の文字列『a』のすべてに対して右隣のセルに文字列『aa』を入力して、さらに同じシート内でC列に複数存在する特定の文字列『b』のすべてに対して右隣のセルに文字列『bb』を入力するようにしたいのですがどのような感じになりますでしょうか? ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ vbacでmdbファイルをcombineしていると、「このアクションを実行するとプロジェクトがリセットされます。実行しますか?」というダイアローグが出てくるのですが、回避策をご存じの方いますか? VBA初心者です。 省略可能なキーワードOptionalに関して質問がございます。 ・質問内容 以下のコードにおいて、なぜ"ABC"が2回繰り返されるのでしょうか? Optionalで指定した1が初期値としてtmpに格納され、For〜Nextステートメントの処理が0〜1となり、回答は”ABC”のみだと考えました。 ・コード Sub Sample1() Call Sample2 End Sub Sub Sample2(Optional tmp As Long = 1) Dim i As Long For i = 0 To tmp Debug.Print "ABC" Next i End Sub 基礎的な質問で恐縮ですが、ご解説いただければ幸いです。 よろしくお願いします。 >>522 0も1回と数えるから、i が0の時に1回、1の時に1回、合計で2回です For i = 1 To tmp にすれば1回になるよ >>523 解説頂きましてありがとうございます。 0も1と数えるのはややこしいですね。。 しっかり復習します。 配列は0スタートとか知っておいたほうが良い(VBAの場合はOption Baseで切り替えられるけど) >>524 理屈で覚えればややこしくはないぞ。 配列の添字は距離のようなもので、「当該配列の1個目の要素のポインタを起点としたときに、そのポインタにどれだけ(何回)加算した場所に、その要素の格納されているメモリが存在するか」を示す数字。 1個目の要素から1個目の要素に移動するための加算回数=距離は0だから、1個目の要素にアクセスするときの添字は0になる。 >>514 if文でセルの指定範囲の時実行で1列目の時と2列目の時で分けたらどうですか? >>525 0スタートどころか-100スタートとかも可能 こればかりはプログラマーを混乱させるために導入されたとしか思えない謎仕様 >>531 配列添字の範囲指定なんてPascalの時代からあるのにバカって悲しいな w >>529 C#だとint[] intArray = new int[2]で要素は[0] と[1]になるんだが、 vbaだとdim Array(2) as Longが0,1,2の三つになるからたまにコンパイルエラーで悩む。Collectionは一から始まるが Dictionaryは0からというのもたまに嵌る。 >>534 > vbaだとdim Array(2) as Longが0,1,2の三つになるからたまにコンパイルエラーで悩む。 0,1,2になるか1,2になるかはOption Baseによる コンパイルエラーは意味わからんが >>533 お前が黙っとけよ w ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる