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/ 早速質問
今vbaでマップ使って
とある表の集計を行なっております
一つのkeyに対しアイテムが複数あるので
配列で入れようと思ったのですがうまくいきません
何か良い方法はありませんか? >>408
一つのキーに対して複数のアイテムがある
これをどうにかこうにか出来ないか
やりたいことは
キーが重複された二次元配列を
グループ化&合計を取りたい >>409
エクセルならピボットテーブルでいいんじゃない? エスパーじゃないんだから、もっと具体的に説明しないと、何がしたくて何ができないのか判んないよ。
そして多分だけど普通にifで分岐するプログラムを書くだけだと思う。 いや多分forでループするプログラムを書くだけだと思う データシート
キー 金額a 金額b
1 10 20
2 20 50
1 30 90
結果(期待)
キー 金額a 金額b
1 40 110
2 20 50
上のような感じのシートがあって
集計かけたり
平均とったり
最大値だったりしたい >>415
そのくらいの事を自分でできないなら
ピボット使った方がいいと思うぞ
バグって計算結果が合わないから そのくらいの事を自分でできないから質問してんだろ
そのくらいの事を理解できないなら質問スレに来ない方がいいのに そのくらいの事も判らない人にも実現できる方法を提案してるだろ https://i.imgur.com/wtkTdlA.png
上のように各列の情報に応じて、一定の条件にヒットしたら評価欄に追記、ということをしているのですが、
上手い書き方が思いつかず、冗長で読みにくいコードになってしまいます
https://i.imgur.com/cE0kOho.png
どうすれば綺麗で読みやすいコードになるでしょうか?
特に、変数(ここでは「評価」)の参照先のセルに書き込みつつ、変数の値自体も更新するスマートな方法と
If文で2つの条件が当てはまった場合に両方の処理を実行させる(ここでは40点以下と60点未満のIf文を一つで済ませるとか)方法があれば知りたいです >>419
配列を使え
あとソースを読んだり修正したりやりにくいから画像にせずそのままテキストとして貼ってくれ
科目 = Array("国語", "算数", "理科")
For j = 0 to 2
点数 = i.Offset(0, j + 1)
If 点数 <= 40 Then
i.offset(0, -1).Value = i.offset(0, -1).Value & 科目(j) & "の点数が以下略" & vbCrLf
みたいな感じで教科の数に関わりなく記述を1回にできる
条件が3つ以上ある時はCaseで分ける方法もあるけど、どんどん文字列を追加するならIfを並べる今の書き方で別に悪くない ありがとうございます、やってみます
(コードは行数制限とインデントが反映されなかったのでつい画像に…すみません) オートフィルの連続データでA1が0なら終わりでそれ以外なら下にオートフィルの連続データを追加して行くってどうやればいい? 下に一つオートフィルの連続データを追加してもしもその数が0以外ならばその下に一つづつ追加してもし0になったら終わるってことです
オートフィルの連続データまでは成功しました! >>424
何をやりたいのかさっぱりわからんから
> オートフィルの連続データまでは成功しました!
のコードを晒してくれ 何をどーしたいのかよーわからんが、
オートフィルの連続データが完成したならDo While Loopでも使えばいいんじゃね そうですね連続データと探す作業分けてDo until使ってみたら目的は達成できました ありがとございます 漠然とした質問で申し訳ない
コレクションというのがあるけど、その利点というかこういう場合に使うとかという
のを教えてくれないだろうか。配列は動的配列も含めてよく使うけどコレクション
というのはあるのは知ってるけどどういう場合に使うものなのか判らない。
(まぁそれでも何とかなってるということは今の時点ではそれでも問題ないって
ことでもあるんだけど) >>428
Dictinonaryだとキーが重複してたらエラーになるから
重複させたくない場合は便利だと思う
あと既にそのキーが登録してあるか調べるメソッドがあるから便利
配列でも実現出来るけど生産性の問題だと思う >>428
Excelならコレクションは知らないうちに必ず使ってるから心配しなくてもいい
オブジェクトを複数まとめた物がコレクションで、例えばワークシートオブジェクトをまとめた物もコレクションの一種
新規ブックを作るとワークシートが3枚あるじゃろ?それがもう既にコレクションなんだわ
名前をよく見ると「Worksheets」って複数形になっとるじゃろ?これが「複数まとめた」コレクションを示しておるのじゃ >>428
コレクションの便利さを実感できるのは、For Each 〜 Nextとか 広い意味では配列もコレクション
元質問のコレクションが何指してるか質問からは分からん >>433
どの言語でもコレクションの定義は曖昧だからなあ。
配列のように物理的に連続したメモリ領域で動かせないものが配列。 気付かないうちにコレクションを使ってたってのは、あぁそうなのかって感じですけど
>元質問のコレクションが何指してるか
思い浮かべてんのは連想配列とかディクショナリとかってやつですかね。
ディクショナリが重複チェックにも使えるってのは知りましたが。
今現在動かしているのをディクショナリに変えて見ようかなとと思ってます。
どちらにしろ自分で判らないことにはすすまんので。
後、曖昧模糊とした質問に答えてくれた皆さん、ありがとう 配列数の制御がめんどいし
個々のデータ型も合わせんでいいし 感覚的な話になるけど、例えば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でも問題ないかもしれないけど。 ■ このスレッドは過去ログ倉庫に格納されています