Excel VBA 質問スレ Part66
■ このスレッドは過去ログ倉庫に格納されています
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part65
https://mevius.5ch.net/test/read.cgi/tech/1584430040/
※デフォルト設定 >>100
そもそもそれ以前に馬鹿過ぎて話にならない VSのエディタなら勝手にやってくれるけどExcelVBEはそこまで親切じゃないから、
・Doと書いたら、中間の処理書く前にLoopをセットで先に書く。
・中間の処理はインデント付ける
こうしないと長い処理だとミスる。 田中先生ユーチューバーになってたんか。
エクセル系ユーチューバーは前からいるけど
彼らのチャンネル登録者数どんどん抜いてくな。
マクロ以外にもエクセルの機能全般もアップしてるし
他のエクセルユーチューバ―はもう躍進することはないな。
ご愁傷さま。 インデントしてるとVBEが勝手に空行にもインデント用スペースいれやがる マクロの処理だけmsオーダーで止めて、シートでの作業には影響させない方法ってありますか?
sleepやapplication.waitを使うと、止めている間はマウスポインタが待機中に切り替わって気が散ります。 DoEvents を定期的に入れてあげて妥協するのがいいのでは waitが長いと入力作業とかできんだろうな
マルチスレッドできたっけ? >msオーダー
ジェイッ、ジェイッ、ジェイッ、ジェイッwwww
>>107
俺もわからん。
どういう意味だろう。 あーミリ秒指定でマクロを止めたいってことか?
それでもまだわからん せめてmsecオーダーと書けばわかりやすいのに
しかも100ミリとかじゃないか?数ミリは気づかないはず
GetInputStateとDoEventsでどうにかできんか >>110
マルチプロセスならできそうな気がしない?
知らんけど [現象]
excelの vbaエディタで、フォントの設定が出来なくなった。
ツール−オプション−エディタの設定を選択すると、excelが強制終了してしまう。
[環境]
windows10 pro
office personal 2019
[発生時の操作]
エディタの設定を、MSpゴシックから、 Ricty Diminished(Ricty Diminished Discordだったかも)
に変更した直後から発生するようになった。
http://blog.higty.xyz/post/vbe-setting-error/
https://www.moug.net/tech/exvba/0150130.html
ここを見ましたが、レジストリキー:HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common が存在しません。
よろしくお願いします >>119
ワークシートのページレイアウトからテーマは変更できる? >>121
はいできますがそれでは解決しないのです >>123
まずレジストリのVBA\7.1\Commonが存在しないことが異常だから、Excelを再インストールするのが一番の早道な気がする >>121
123 は私の書き込みではないのですが、レイアウトを変更して何かファイルを保存すれば
レジストリキーが作成されるということかと思い試しましたが、作成されませんでした
>>124
やはりそれしかないですかね。 >>125
×レイアウトを変更して
○テーマを変更して >>104
萩原をおぎわらって読んだりIndirectをインディレクトって言ってたから
そっ閉じしたわ。 インストロールと言ったら怒られたナリみたいなもんか。 奇天烈大百科が巻物だったら、まさしくインストロールだぞ 奇天烈大百科が巻物だったら、まさしくインストロールだぞ
↓
If the eccentric encyclopedia is a scroll, it's just an installation.
↓
風変わりな百科事典が巻物なら、それは単なるインスタレーションです。
意味がさっぱり分からなかったので、Google翻訳かけてみたら、意味が分かるようになったぞ。 textboxの値チェックがうまく行きません。20~100までの範囲を入れたいのでchangeイベントで値がこの範囲か監視してます。
100を超えていたら100に、20を下回ると20になる様にリミッタを付けました。
すると100にした後にキーボード操作で30にしようとすると、0を消した時点で強制的に20になり、そこから何か押すと100になってしまいます。
どうすれば上手くいくのでしょうか。 >>132
そういう時はスピンボタンを使った方がいいよ 馬鹿はWindowsのUIもわからず自分勝手なインターフェースを作る法則 >>136
ハゲとるやないかw
髪でうまくごまかしてるようだけど >>135
ありがとうございます
コピペ対策以外は出来ました ちょっと息抜きにセルや文字の色をVBAでやろうと思ったら大きく二通りあるんだね
カラープロパティとRGB関数
どっちで覚えるのが王道? いや違うか
そんなに普段カラフルに使わないならカラーインデックス
細かく覚えて使いたいならカラープロパティかRGBってとこか
うーん前者かな >>139
わかってない
ColorプロパティにRGB関数やインデックスの値を代入するんだよ
基本的には両方使わないと色が変えられない >>141
なるほどぜんぜんわかってなかった
インデックス番号で数種類覚えちゃうか
RGB関数でいくつかの組み合わせ覚えちゃうか
何やろうにしても何種類かやり方があって初心者にきついわ >>142
インデックス色はカラーパレットの位置に設定してある色だから環境によっては色が変わるよ ほんと勉強になりますわ
最初は0と255の組み合わせだけでRGB関数で覚えちゃうようにしますわ
この8種類くらいしか多分使わないかな どういう時どれを使うのが適しているかで選ぶのであって、どっちで覚えるとかじゃない >>145
社内のマクロツールの中味たまに見るけどなんとなく、どっちかに統一してるって感じの人が多くない? どっちでもいいんであれば好きに統一すればいいんじゃね たかが色だと思って使わないと思ってたけど
メッセージボックスで黄色い部分の数値を確認後、入力とかで
その範囲を真っ黄色にしてやって元に戻したり
他人、(おばちゃん)とかにはとにかくわかりやすく作るようにしてみることにした rgb値の組み合わせを覚えるのは大変なのでWebColor名で覚えるといいかも。
rgbAliceBlue
rgbLightBlue
rgbBlue
rgbMidnightBlue
みたいな感じで記述すればrgb値を指定できる。よく使うやつだけ覚えとけばいい。 vbRed 「・・・。」
vbGreen 「・・・。」
vbBlue 「・・・。」 あーおれも、基本はそのvb〜だ
グラデーション的な見栄えが必要の時とかは変えるけど アクティブシートをコピーした後のコードがムズいなぁ
細かい所をいじる知識がなさすぎ 逆に原紙を作っておいて普段はそのコピーを使うようにするといい >>154
ありがとう。その方が都合そうしたよ。
シート名の取得も特定のセルから何とかできた。あとはブック名を指示したいんだけど調べりゃすぐ出てきそうだけどなかなか出て来ないわ
エラー出ないように細かく作りたいもんだけ 10万円給付の紐付けなんかVBAで余裕に出来るのに話題にならないのが不思議 >>156
こういう馬鹿が職場にいて余計混乱させているだけだろ 絶対にわからん関数ばかり使ってる理解不明なコードをネットからパクって少し弄ったら完全に業務で対応できてラッキー
そこから今日もユーザーフォーム適当に作ってメッセージボックスとインプットボックスを組んでいって
効率化したけど相変わらず上達せん毎日だわ >>156
1億2000万件のデータを、誤読無く、重複無く、生死の年月日まで
勘案して処理する自治体まで勘案してエクセルに食わせろとな? 相談させてください。
羅列されたデータにオートフィルタをかけて、その中でのランダム選択をシートを使わないでやる方法が知りたいです。
A列(1〜6年)、B列(1〜8組)、C列(名前)
みたいな感じで、AとBから複数選択後にCから選び出す感じです。
今までは作業用のシートを設けてオートフィルタをかけたものを別シートにコピーし、その中でrandomで選んでいました。
諸事情により作業用シートが作れないので、おそらく配列内だとは思うのですが・・・・ >>163
VBAなら、とりあえず乱数を発生して、その行がオートフィルタかかってたらもう一度乱数からやり直せばいいだけ >>163
フィルタ掛けた結果をROWだけ配列に抜き出して、乱数で配列の中から一つ選べばいいんじゃね >>166
早速ありがとうございます
そのままだとフィルターかけられたROWも選ばれません?
オートフィルターかけた配列を一旦コピーすればいいのでしょうか? ランダム選択が目的なら、そもそも、オートフィルターにこだわる必要あるのかな?
VBA使うなら、オートフィルターを扱うのは微妙に面倒だから、自前でフィルターすればいいと思うぞ オートフィルタやオートフィルタ的コードは使わない
VBAのみで
乱数生成は一度きり
3桁の乱数 a を生成する
まず a を6で割って余りが0〜5まででるんで
0が出たら6年
1が出たら1年
2が出たら2年
3が出たら3年
4が出たら4年
5が出たら5年
とする
例えばここで2が出て2年が選択されたら
さっきの乱数 a をまた使って、組数で割って余りを求める
んで同じようにして
今度は選択された組の人数で割って個人に割り当てられた番号でを特定する
これを繰り返して複数人を選んでいく
選ぶ過程で同じ学年はダメとかあるなら
上の例で言えば一旦2が出たら次は2を排除するとか
繰り返し文の中で if 使って条件つけていく
学年の数、組の数、クラス人数は予めシートに表にしておくこと
とかとか 6学年あって6組の学年があったりするとだめか
階層が下がるごとに乱数生成してもいいのかね A1からオートフィルターをかけて
もし、変数aが空欄でなければ、B列で変数aと同じ値だけにしぼる
もし、変数bが空欄でなければ、C列で変数bと同じ値だけにしぼる
もし、変数cが空欄でなければ、D列で変数cと同じ値だけにしぼる
というような書き方をおしえてください >>163
Dim r As Range
Dim n As Long
Dim i As Long
With Range("A1").CurrentRegion
With .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
n = 0
For Each r In .Rows
n = n + 1
Next
if n = 0 then
exit sub
end if
n = 1以上n以下の乱数
i = 1
For Each r In .Rows
If i = n Then
rを使ってなにかする
Exit Sub
End If
i = i + 1
Next
End With
End With >>173
まず意味が不明 →「変数aが空欄」
よくわかんないけど、
特定の表について、
VBA上で宣言した変数ごとに対応した列をフィルタする簡単なものなら書いてみた。
「空欄」の意味が不明なので、NULLか空文字か、それともセルのことだったのか、
そういうことも質問時に気にするように。
https://i.imgur.com/wNuWmnl.png 余談だがグループの中から1人をランダムで選ぶ場合、
同じことを繰り返すと同じ人が選ばれる可能性がでてくる
それを無くしたい場合はシャッフルしてから順番に選ぶといい 何かをさせるときに一度リセットする的なアレですね。
プロージャくっつけて作ってる初心者だが何となくその感覚
スマホとPCのデータが両方消えて
前スレで乱数の発生教えてくれた人のコードが見れなくなったが、やべえ いや選ばれる人の立場になると、
俺前回やったのにまた俺?他の選ばれてない人はズルくね?みたいな 前スレの教えてくれた恩人のコードやっと見つけたあああああ
Sub 乱数発生させる()
For 項目 = 1 To 6 '項目数を変更
列 = 項目 + 2
最小 = WorksheetFunction.Min(Cells(6, 列).Resize(30))
最大 = WorksheetFunction.Max(Cells(6, 列).Resize(30))
幅 = 最大 - 最小
For サンプル = 1 To 25 'サンプル数
行 = サンプル + 5
If Cells(行, 列) = "" Then
Cells(行, 列).NumberFormatLocal = "0.000"
Cells(行, 列) = Rnd() * 幅 + 最小
Cells(行, 列) = Round(Rnd() * 幅 + 最小, 3)
End If
Next
Next
End Sub
これがC6がサンプル1の項目1が始まりになるシートで使えてるんだけど
これをC12からとかに変えるにはどこ弄ればいいですか?
誰かコメントをこれに添えてもらえませんか…
前スレの大恩人に救われたコードを更に流用したいです Sub 乱数発生させる()
For 項目 = 1 To 20 '項目数を変更
列 = 項目 +
最小 = WorksheetFunction.Min(Cells(6, 列).Resize(30))
最大 = WorksheetFunction.Max(Cells(6, 列).Resize(30))
幅 = 最大 - 最小
For サンプル = 1 To 25 'サンプル数
行 = サンプル + 11
If Cells(行, 列) = "" Then
Cells(行, 列).NumberFormatLocal = "0.000"
Cells(行, 列) = Rnd() * 幅 + 最小
Cells(行, 列) = Round(Rnd() * 幅 + 最小, 3)
End If
Next
Next
End Sub
項目数を20に変えてC12セルから入力させたいんだけどWorksheetfunctionのとこの6と30も変えないとダメですかねこれ
乱数が狂うのかなぁ Sub 乱数発生させる()
For 項目 = 1 To 20 '項目数を変更
列 = 項目 +
最小 = WorksheetFunction.Min(Cells(12, 列).Resize(36))
最大 = WorksheetFunction.Max(Cells(12, 列).Resize(36))
幅 = 最大 - 最小
For サンプル = 1 To 25 'サンプル数
行 = サンプル + 11
If Cells(行, 列) = "" Then
Cells(行, 列).NumberFormatLocal = "0.000"
Cells(行, 列) = Rnd() * 幅 + 最小
Cells(行, 列) = Round(Rnd() * 幅 + 最小, 3)
End If
Next
Next
End Sub
考えたけどこれかなぁ
他ののまっさらなシートだと乱数再現できた
けど反映させたいシートだと乱数が狂う
配置も数値も同じなのに
シートの設定かぁ 数千行〜数万行のデータが格納されてるシートで、
ある特定の範囲で最大文字数を取得するには
配列関数で{Max(Len(A1:A10))}とすれば良いですが(VBA上でEvaluateを用いて実装してます)、その最大文字数があるセルの場所(行番号)を特定する方法はありますか?
最大文字数のセルが複数ある場合はその全てのセルの行番号を取得したいです
最終的に、範囲内の最大文字数のセルの背景色を変えたいのが目的です >>184
セルの文字数がその最大文字数と同じなら色変えるっていう条件付き書式を設定する >>185
条件付き書式とは盲点でした。
トライしてみます。ありがとう! わかった。
けどもう後には引けんほど次元の高い事やらせてて手に負えないわ フォームのラベルに計算結果を表示について。
結果がプラスならそのまま、マイナスなら赤字にマイナス記号を付けるにはどうしたらいいですか?
例
350
-350←赤字 >>183
セル範囲の内容で乱数の範囲が設定されているからデータが入力されていないと乱数にならないのに、
そこにデータが入力されていると値が更新されない
なかなかのジレンマだね
余談だけど、直感的にわかりにくいから、ループカウンタは列と行そのものにした方がいいと思うぞ
あと、項目数と基準セルを変えたいなら、それを変数にして、こんな感じ
項目数 = 20
サンプル数 = 25
行0 = Range("C12").Row
列0 = Range("C12").Column
For 列 = 列0 To 列0 + 項目数 - 1
...以降も上記変数で置き換える >>190
ありがとう、全部のコード貰った後に少しずついじる事しかできないレベルだからまた挑戦してみるわ
コメントしっかり残して勉強するべしですな >>190
それとこのコード見てさらっとそうやって理解できるってやっぱすごいね
仰るとおり今記入してある数値はそのまま
で残りその数値を元に乱数で埋めるというのを
前スレの人が教えてくれた
みんな凄いの一言 パワークエリでデータモデルに読み込んだ後ファイル移動等して元ファイルを参照できない状態からデータをシートに書き出したいのですがvbaで出来ますか?
手動では既存の接続からテーブルとして書き出せるのですがマクロ化するとクエリの更新処理でパスが見つかりませんというエラーになります >>189
その文章そのまんま単純に処理に起こすだけでいけるだろう >>194
読込時にテーブルデータを別シートにコピーするようにしとけば? >>194
Excel.Currentworkbookで、テーブルの値をパスとして読み込むようにしておいて、ファイル移動したらVBAでそのテーブルの値を書き換えるようにする 銀行まるめ型だっけ
仕事で四捨五入多用する俺はあの機能がうざすぎる
Format関数使ってるけど素直にRound関数はエクセルと同じ機能にしろよマジで >>196
容量がでかいのでどうしても必要なときだけシートに書き出す形にしたいんです
>>197
元ファイルは自分のローカルにあって共有フォルダで別の人が使う想定なので ある何かをやりたいときに骨子になるコードが完成するともうそこから手直しが楽しくて止まらないわ ■ このスレッドは過去ログ倉庫に格納されています