Excel VBA 質問スレ Part68

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ dbda-8BP0)
垢版 |
2020/08/30(日) 11:55:27.33ID:Oy/VxFsh0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付ける

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part67
https://mevius.5ch.net/test/read.cgi/tech/1593104489/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/09/07(月) 12:55:41.51ID:ZbJzmFKoM
>>91
内容も読まずに書くなよクズ。SQLのことだろうが。
2020/09/07(月) 18:18:17.86ID:R5ozSk7c0
ここで質問したらダメだったみたいですね
該当スレとかあるのでしょうか
2020/09/07(月) 18:26:10.30ID:aZP2Fcscd
>>93
http://egg.5ch.net/test/read.cgi/welfare/1598921138/
2020/09/07(月) 18:43:17.53ID:K46ocmR8a
>>88
これをどこで聞けばいいのかもわからなかったらFE受かるの難しいよ…
2020/09/07(月) 20:07:21.03ID:Yu9E5X6OM
VBA勉強しはじめて、ようやくOutlook連携とかzip圧縮とかやり始めたんだけど
Excelそのものの操作に関する情報と比べて、参考に出来る情報の質も量もガクッと落ちた気がする

やっぱ話題のpythonに切替えたほうが悩まずやれるのだろうか
2020/09/07(月) 20:09:11.40ID:Yu9E5X6OM
質も量も、っていうのはノンプログラマーの自分が探せる範囲って意味です
98デフォルトの名無しさん (ワッチョイ e7e6-dQ4P)
垢版 |
2020/09/07(月) 20:22:49.70ID:sgrgY4Mk0
zip.exe叩けばええやろ
99デフォルトの名無しさん (ワッチョイ 5f6d-4jJb)
垢版 |
2020/09/07(月) 20:51:37.54ID:/DR3/4oV0
目の前に答えが書いてあっても理解できない、答えだと気付けない
これが「馬鹿には無理」の意味
2020/09/07(月) 21:00:18.85ID:Yu9E5X6OM
半年ROMって勉強します押忍押忍押忍
2020/09/07(月) 21:22:51.97ID:JIC+p5t3M
何をしたいかによるけど、Windowsの操作の自動化っていう範疇ならPowerShellおすすめ
Comオブジェクトも使えるよ
102デフォルトの名無しさん (アウアウエー Sa1f-yOpk)
垢版 |
2020/09/07(月) 21:38:02.53ID:J1GBImUha
なにがおかしいの?
Sub func()
Dim url As String: url = "https://e-hentai.org/g/1727798/1fbe77a0a2/";
Dim buffer As String: buffer = ""
Dim objLinks As Object
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False

objIE.navigate (url)
Do While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop

Call WaitFor(3) ' wait for 3 seconds

objLinks = objIE.document.getElementsByClassName("gdtm").outerHTML

Cells(1, 1).Value = objLinks

objIE.Quit
Set objIE = Nothing
End Sub

Function WaitFor(ByVal second As Integer)
Dim futureTime As Date: futureTime = DateAdd("s", second, Now)
While Now < futureTime
DoEvents
Wend
End Function
2020/09/07(月) 22:46:01.59ID:qahfABoQ0
IEはもう無くなるよ
2020/09/07(月) 22:49:52.43ID:744b2nM10
>>102
Dim objLinks As String
2020/09/07(月) 22:54:20.72ID:VQNIMFGd0
>>103
IEの代替え何使ったらいいの?
2020/09/07(月) 23:07:32.69ID:744b2nM10
>>105
データをダウンロードするだけならブラウザを使わずに直接ネットアクセスした方が早くて簡単
色んな方法があるけどXMLHTTPとかWinHttpRequestとか調べてみ
2020/09/07(月) 23:17:00.84ID:VQNIMFGd0
>>106
ありがとうございます


'JavaScriptを実行しFormを送る処理
objIE.Navigate "JavaScript:doAction('/文字列')"

みたいなことしないとアクセスできないサイトのデータが取得したいのですが
他に方法ありますか?
2020/09/07(月) 23:22:23.18ID:sgrgY4Mk0
JavaScriptを読んで何やってるか調べろ
2020/09/07(月) 23:49:39.86ID:744b2nM10
>>107
Form送信は単純なHTTPアクセスで代替できるケースが多いから、これもブラウザを使う必要はない
てか、WEBの構造はVBA関係ないし
2020/09/07(月) 23:56:10.64ID:UwONkXQv0
エクセル2010です。
上書き保存時にすべてのシートでA1セルを選択するようにしたいのですが、
Ctrl+S時とボタンのクリックイベントで挙動が違うことにハマってます。
1枚目シートにactiveXコントロールのボタンを配置し、VBAの構成は以下です。
1. シートモジュール : ボタンのクリックイベントにThisworkbook.saveだけを書いています。
2. ThisWorkbookモジュール : beforeSaveイベントで3を呼び出し。
3. 標準モジュール : 全シートのA1セルを選択するSubプロシージャ。ForEachでまわすだけ。

Ctrl+Sの際は2→3でうまくいきます。
ボタン押下の場合は、1→2→3と流れてはいるものの、なぜか各シートがactivateされなず、activeSheet.Range("A1").Selectが働きません。
1のクリックイベントから直接3を呼び出すのは、うまく行きます。

何故このような挙動になるのか分からず数日ハマってます。
どなたか、ご教示よろしくお願いします。
111デフォルトの名無しさん (ドコグロ MM7b-aCGe)
垢版 |
2020/09/08(火) 02:03:49.70ID:weDKADyMM
>>110
for i= activeworkbook.worksheets.count to 1 step -1
apprication.goto activeworkbook.worksheets(i).range("a1")
next i
activeworkbook.save

スマホ打ちだから綴りミスはあるかも
2020/09/08(火) 07:47:00.42ID:vMdvrooDa
>>110
For eachで全シート回してるならActivateしなくても、
sh.Range("A1")で行けないか?
2020/09/08(火) 07:48:01.88ID:vMdvrooDa
>>112
間違えたsh.Range("A1").Selectだわ
2020/09/08(火) 10:40:31.23ID:C66iYfBu0
>>110
働かないという場合の原因で以下のことを調べてみ

1.実は働いていたがその後に別の動作をしたため働いていないように見える
2.働こうとしたが、なんらかの異常が出て失敗している
3.その処理が実行されていない(on errorやifの条件、イベント発生していないなど)
2020/09/08(火) 11:03:00.55ID:0vfIbeP00
>>105
漏れは、yahoo のログインとか、
Ruby, Selenium Webdriver で、ブラウザを自動操作してる

単純なダウンロード・スクレイピングなら、RubyのNokogiri。
外部コマンドなら、curl, wget
116デフォルトの名無しさん (ラクッペペ MM8f-dQ4P)
垢版 |
2020/09/08(火) 11:52:57.99ID:POT3YWITM
Application.EnableEvents=Falseしてるとか?
2020/09/08(火) 16:58:59.99ID:qXkQmTRa0
“>-1”&i
て書いたときに >-2, >-3... っていうふうに比較値が意図せず負に進むんだけど正の値に足したい場合ってどうすれば良いでしょうか。
2020/09/08(火) 18:39:01.86ID:p9XW8v7Na
>>117
VBAの挙動の問題

-を文字列、1を数値として認識してる

そもそも、-1をダブルクォーテーションで括ってるのは文字列として-1を認識させたい時のみにするのが基本
なので、ダブルクォーテーションを取ってやれば意図通り動くはず
119デフォルトの名無しさん (ラクッペペ MM8f-dQ4P)
垢版 |
2020/09/08(火) 19:07:42.80ID:Pjd0b/NhM
へー、そんな挙動するんだ。知らなかった

>-11
>-12
>-13
になると思ってたよ
2020/09/08(火) 19:08:20.88ID:E23V8S4o0
>>113
activeじゃないシートはselectできないと思うが
2020/09/08(火) 19:10:47.69ID:E23V8S4o0
>>110
Forの中身が間違ってるとか別のブックを見てるとか
ほんとに選択したいシートが選択されてるか確認した?
122デフォルトの名無しさん (ワッチョイ 0701-biH0)
垢版 |
2020/09/08(火) 20:06:33.41ID:qXkQmTRa0
>>118
クォーテーション外してやってみたけど上手くいかないです...

初心者なんで拙いですが、一応自分で書いたものをのせます。
既出のデータを整理して2次元チャートを作成する目的です。

Dim cnt As Integer
Dim x As Long
Dim y As Long
x = 0
y = 0

For x = 0 To 10
For y = 0 To 10

cnt = WorksheetFunction.CountIfs(Range("B2", Range("B2").End(xlDown)) "<=" 0 + x, Range("B2", Range("B2").End(xlDown)) ">= -1" & x, Range("C2", Range("C2").End(xlDown)) "<= 0" & y, Range("C2", Range("C2").End(xlDown)) ">= -1" & y)

Cells(x , y) = cnt

Next y
Next x
2020/09/08(火) 20:34:38.38ID:E23V8S4o0
いつも人任せだな…
そのcountifの引数の中身が自分の意図した内容かなんで確認しないの?
2020/09/08(火) 21:43:07.59ID:MiWYYVaX0
もう30過ぎて勉強もなぁ…って手が進まない
VBAを知識をパンパンに詰め込んでああこれねって感じでカタカタと打ち込んでプロシージャ作りたいもんだわ
2020/09/08(火) 21:57:43.01ID:E23V8S4o0
考えることを人に丸投げしてるだけで勉強は関係がない
2020/09/08(火) 22:00:12.71ID:MiWYYVaX0
人に丸投げというかネットで拾ったものの組み合わせでいつも何とかしてしまう
知識がほとんど入らない
異動希望出してるしなぁ
2020/09/08(火) 22:06:16.19ID:aT8iqlgZ0
エクセルの指定列から3列コピーしてその4列目に挿入して貼り付けた後セルに入ってる値を消すコードをRangeじゃなくてCellsでやりたいです。
clmtar=10
10〜13列をコピー
14列目に挿入
14〜17列目のセルの値クリア。
2020/09/08(火) 22:11:08.52ID:+kf0/gdp0
>>127
コピー後の値を消すの?
元通りになるだけだと思うけど
2020/09/08(火) 22:29:42.46ID:C66iYfBu0
>>126
愚痴る暇があったら入門書かって1ページでもいいから読んでろ
2020/09/08(火) 22:34:56.39ID:MiWYYVaX0
>>129
すんません…なんか職場でおばちゃんがあれも作ってとか調子こいてるだけで
こりゃまた愚痴だわ
これぞ!っていう入門書ありますかね
イチからガチで鍛えてみるかな
2020/09/08(火) 22:36:08.93ID:8mxHLcBxa
>>126
なんとかできてるならそれも実力のうちなのだと思うよ
楽しい、自分ならこうしてみたい、こうしたらどうなるのだろう
とかがないならそこまでだけど
2020/09/08(火) 22:40:05.68ID:MiWYYVaX0
ネットで検索
プロシージャを組み合わせたり簡単なところをイジる
出きたと思ったら会社のメルアドにプロシージャ貼り付けたテキスト送る
会社で組み合わせる
UserFormのボタンに割り当て
これでごまかしつつやってきた
圧倒的な知識が欲しいなぁと
2020/09/08(火) 22:47:12.09ID:C66iYfBu0
>>130
それすら他人に頼るようじゃいつまでたっても進まない
2020/09/08(火) 22:50:54.91ID:E23V8S4o0
今までどおり困ったら初心者ですとか勉強中ですとかで知識ないアピールで人にやらせて突っ込まれたら謎の正当化とどうでもいい言い訳で誤魔化してやっていくんだろうな
2020/09/08(火) 22:52:28.72ID:MiWYYVaX0
ネットで調べてなんとかなってしまう時代のせいだよね
俺は悪くない
2020/09/08(火) 23:27:06.50ID:HhRrDF1oa
そういう人が増えてきたからあんまり教えないようにしてる
137デフォルトの名無しさん (ワントンキン MM7a-nV8z)
垢版 |
2020/09/09(水) 00:19:56.45ID:akgtbWjMM
ゆとり世代の特徴だぞ
2020/09/09(水) 00:23:30.44ID:Lvk20igu0
>110です。
書き込み後にいろいろググったところ、いくつかのサイトで
コードからの保存はbeforeSaveイベントが正常に働かない旨の記載がありました。
今回の事象もこれに当たるのかなと考えています。
そんな訳で、ボタンでの保存はenableEventsをfalseにして別処理にしました。
回答くださった皆様、ありがとうございました。
2020/09/09(水) 00:53:57.72ID:0o8c0VF10
別にここで聞いても答えなんて返ってこないし期待してないのでご安心を
140デフォルトの名無しさん (ワッチョイ 39e6-Pwf7)
垢版 |
2020/09/09(水) 01:12:42.60ID:VoppH/up0
足し算がわかりませんとか言われても入門書でも読めとしか言えないよな
2020/09/09(水) 04:06:45.89ID:Y+JI74HRa
入門書読めと言うとどの入門書がいいか聞いてくるよ
2020/09/09(水) 08:19:04.77ID:z9RILJ2v0
入門書を紹介すると今度はどこで買えばいいか聞いてくるよ
2020/09/09(水) 09:27:32.52ID:8tppu1V70
通販で買えって言うとお金がないって言ってくるよ
2020/09/09(水) 09:43:27.85ID:9AZapVJXM
お金あげると姿をくらますよ
2020/09/09(水) 10:03:14.46ID:I5K9tGVf0
しかも捨て台詞付きで
2020/09/09(水) 10:37:20.74ID:KbsHkxtjM
すみません。ちょっと長くなってしまうのですがTreeViewをいじっているうちに分からない事があったので教えて下さい。
TreeViewの子ノードをD&Dでリストボックスにコピーする動作を作っていたのですが、ドラッグ開始時点のSelectedItemを取得しようとすると1度子ノードをクリックした上でD&Dを行う必要がありました。
その為、既定引数のIPOS,yPOSを使ってHitTestをSelectedItemに代入しようとしました。
しかしそれが上手く動作せず色々調べた結果、
xとyに*15をすると言う記述を見つけ試してみたところ、思い通りの動作を得られました。

しかしながらこの15はなんの15なんだ。他の環境ではこの数値は変わるのか。変わるならば何を元に算出すれば良いのだろうか。
という疑問が浮かびました。
お手数をお掛け致しますがお分かりになる方がいらっしゃいましたらご教授頂けませんでしょうか。
2020/09/09(水) 14:26:55.25ID:dKuEV/F30
まずその15をかけるってどこに書いてあったんだよ
2020/09/09(水) 16:31:31.09ID:0Qh2iKtEa
Windows標準のシステム解像度だとピクセルとTwipsの比率が1:15だからってスタックオーバーフローに書いてあった
149デフォルトの名無しさん (ラクッペペ MM3e-AH3D)
垢版 |
2020/09/09(水) 17:07:35.99ID:cdbk3sfrM
c言語のdefineに相当する文法は無いですか?
constだと違和感がありますので
2020/09/09(水) 17:36:02.11ID:KbsHkxtjM
>>148
助かります
ありがとうございました

という事は使用環境次第では正常に動作しない場合も有り得るって事なのですね。対策を検討してみます。
2020/09/09(水) 17:50:55.91ID:jCqtOC3ba
>>149
どこに違和感があるのかを言わないと案を出せません
2020/09/09(水) 20:59:39.02ID:ynJDkc680
>>128
コピー後挿入したら隣に3列追加されてセルの長さもコピーした3列と同じになりますよね?
2020/09/09(水) 21:05:53.63ID:I5K9tGVf0
列幅をコピーすればいいのでは…
2020/09/09(水) 21:18:50.45ID:Uey8EdNp0
>>152
幅を一緒にしたいなら最初からそう書けば良かったのに
155デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/10(木) 00:02:31.06ID:a+RPoaYl0
>>149
あなたが思っているC言語のdefineの使い方は、コンパイラが置換するもので、定数の概念とは少し違いますよ?
156デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/10(木) 00:04:04.82ID:a+RPoaYl0
>>152
そもそも列の挿入操作が必須なのか?
157デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/10(木) 00:05:42.63ID:a+RPoaYl0
列の挿入なんてあちこちに影響するから、やりたがる理由がわからない。
2020/09/10(木) 01:40:18.04ID:JZj4+m/Aa
条件付き書式が壊れたりすると面倒
159デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/10(木) 02:24:17.86ID:a+RPoaYl0
自分の操作と同じ手順を踏みたいだけなんだろうね

プログラマではない素人感覚
160デフォルトの名無しさん (アウアウエー Sa52-psz/)
垢版 |
2020/09/10(木) 04:18:44.38ID:026ADmyCa
test
2020/09/10(木) 07:50:51.47ID:T4cQI13RM
超初心者なんだけど
配列の中から指定値の近似値の座標を検索するのにいい感じの方法はないでしょうか
(以下、以上、完全一致全て含めての近似値)
162デフォルトの名無しさん (ラクッペペ MM3e-Pwf7)
垢版 |
2020/09/10(木) 08:50:52.35ID:l+lun8zfM
どうせ大した数じゃないんだろ
総なめしろよ
2020/09/10(木) 09:29:12.78ID:rdKJuFJTa
>>161
for eachで比較対象値と指定値を全て比較して、結果出力してその中でMIN関数使えば
2020/09/10(木) 10:03:54.29ID:QatXFD490
>>161
前もってソートした配列作って二分探索か、
配列の値-指定値の絶対値が最小になる値を探す
2020/09/10(木) 10:32:25.89ID:vUgEJ8vWd
Min(Abs(配列-指定値))
2020/09/10(木) 12:18:21.67ID:tJgZROmkM
指定値と配列値の差分を絶対値にして比較した場合、
指定値が5だとして
配列  差分(ABS)
4     1
7     2
となり、最小の差分は1とわかる
座標を知りたいので指定値(5)-差分(1)=4となり、配列の中から4を検索して座標を調べればいいのかなって思ってたんだけど
絶対値で出てくると5-1か5+1どっちを検索すればいいか不明じゃないですか?
そこらへんを解決する方法があれば聞きたいです
167デフォルトの名無しさん (ラクッペペ MM3e-Pwf7)
垢版 |
2020/09/10(木) 12:33:38.92ID:l+lun8zfM
ひとつに絞りたいならお前がルールを決めればいい
お前に決定権がないなら保護者に聞け
2020/09/10(木) 12:50:19.18ID:/arv21np0
ExcelVBAのフレームワークってないんですか?

PHPやJavascriptはまずフレームワーク覚えるもんだと思うのですが
VBAだとそういうのが見当たらなくって・・・
2020/09/10(木) 12:52:37.90ID:sAyQhYLaM
見よう見まねで結構大掛かりなマクロを作った
情シスには程遠い事務の部署で
改善賞1万円
うーんもうちょい欲しかった
2020/09/10(木) 13:06:54.18ID:PB4qSPsyd
オフイスを便利に使うためのお手軽言語でフレームワークの勉強とかやってたら非効率な上に大したメリットもない
2020/09/10(木) 13:09:58.25ID:4uvZuCuyM
フレームワークという意味ではVBAそのものがVB6のOffice向けフレームワーク
さらに言えばExcel向けに特化したものがExcelVBA
他のOfficeソフトにもそれぞれのVBAがある
2020/09/10(木) 13:11:29.05ID:XKC0VKf0M
>>167
一つに絞りたいというか最も近しい値を知りたいのです
指定値が5のとき、配列が4と7なら4を、3と6なら6の座標を調べたい
1万行は超えるから総なめはちょっと…
2020/09/10(木) 13:21:59.05ID:4mlwjCSed
>>172
パソコンにとっては「たった」1万行だよ
総舐めが一番簡単だし、開発時間も含めれば一番早い
2020/09/10(木) 13:23:29.76ID:4mlwjCSed
総舐めでもここでグダグタ言ってる間に結果が出る
175デフォルトの名無しさん (ラクッペペ MM3e-Pwf7)
垢版 |
2020/09/10(木) 13:38:32.36ID:l+lun8zfM
>>172
は? 質問は4と-4だろ?

もう俺が決めてやるよ
-4にしろ、はい解決
2020/09/10(木) 13:41:25.58ID:Yq3PJL3D0
セルを弄くり回すとかじゃなくて配列のまま総舐めするなら1万行ぐらいすぐ終わるでしょう
指定した値aの近似値が欲しいなら
If a-x<=Array(i) And a+x>=Array(i) Then
とかで引っ掛かる奴を引っ張り出すなりなんなりすりゃあ良い
177デフォルトの名無しさん (ラクッペペ MM3e-Pwf7)
垢版 |
2020/09/10(木) 13:43:28.62ID:l+lun8zfM
あ、ごめん
俺が質問を勘違いしてたわ
2020/09/10(木) 13:48:20.19ID:Yq3PJL3D0
近似値の範囲が不定で最も近い値を探すって言うならRank関数とかLarge関数とかSmall関数使うのも手
179デフォルトの名無しさん (ラクッペペ MM3e-Pwf7)
垢版 |
2020/09/10(木) 13:50:34.65ID:l+lun8zfM
>>168
各オブジェクトに多数のイベントが設定されているでしょ
windowsのプログラミングはイベントドリブンが基本
ブックが開いた、ボタンが押された、マウスが動いたなどのイベントに対するコードを書いていけばアプリケーションが完成する
180デフォルトの名無しさん (ワッチョイ 3dad-sCec)
垢版 |
2020/09/10(木) 18:35:00.61ID:VdzBOqiR0
すみません今宿題でこれやってるんですけど打ち込んでもなにも出ないのですがなぜでしょう
181デフォルトの名無しさん (ワッチョイ 3dad-sCec)
垢版 |
2020/09/10(木) 18:36:01.33ID:VdzBOqiR0
https://i.imgur.com/poQzyJO.jpg
これです
2020/09/10(木) 19:09:29.54ID:yo745YZ80
打ち込んだだけで実行してないからじゃね
2020/09/10(木) 19:30:20.82ID:L0+T18/AM
どこに打ち込んだかも分からないしなんとも
184デフォルトの名無しさん (ラクッペペ MM3e-Pwf7)
垢版 |
2020/09/10(木) 19:46:53.46ID:cO3BfNoWM
汚えコードだな
2020/09/10(木) 19:55:23.47ID:T9YJeJvx0
>>166
コードが汚すぎる
2020/09/10(木) 20:10:09.84ID:QatXFD490
>>181
セルの幅や高さは初期状態?
2020/09/10(木) 20:12:24.09ID:QatXFD490
あ、なんでもない
2020/09/10(木) 20:17:20.03ID:QatXFD490
普通に動いたんで入力ミスとか環境の問題かな
2020/09/10(木) 20:49:46.36ID:Rp5mNNXSd
パズルゲームを作ってます。

セルを奇数列から横2マス選択してドラッグさした場合に、移動先が同じ奇数列から始まる場所なら許可。偶数列から始まる場所に移動した場合は不可にして移動をキャンセルさせたいんですがどうしたら出来ますか?良いEVENTってあるんですかね?
2020/09/10(木) 21:52:44.31ID:WalExY5Hd
>>180
そのまま入力してちゃんと動いたから、問題文には間違いはない
https://i.imgur.com/kojc0gJ.png

それにしても学校の宿題だとしたらひどすぎるな
先生がこんなに汚いコードしか書けないとか生徒がかわいそう
2020/09/10(木) 21:54:41.31ID:WalExY5Hd
ああ最後の方に入力ミスあったわごめん
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況