Excel VBA 質問スレ Part62

■ このスレッドは過去ログ倉庫に格納されています
1
垢版 |
2019/06/24(月) 00:21:37.48
!extend:checked:vvvvv:1000:512

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

※前スレ
Excel VBA 質問スレ Part61
http://mevius.5ch.net/test/read.cgi/tech/1556203263/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/07/28(日) 09:32:44.25ID:Ao5MhP5V0
> セル番地(F10)を
つまり「$F10, F$10, $F$10」が答えってオチ?
2019/07/28(日) 09:54:38.87ID:UXTeVNdOd
>>527
俺はそう解釈したが。
むしろCとかEとか何処から出てきたん
2019/07/28(日) 12:28:22.02ID:Ln2vM5+c0
>>526
単価バラバラの個数集計して何をしたいんだ?
530デフォルトの名無しさん (ワッチョイ 068c-0v1+)
垢版 |
2019/07/28(日) 15:40:47.61ID:9CPL8aqE0
>>507
>>512
”ここの外で記します”だから
F10以外のセルに記する
すなわちF10以外のセルからF10を参照するにはどのように書けばいいかということじゃない?
1. $F10
2. F$10
3. $F$10
2019/07/28(日) 15:44:43.68ID:sZg+ZdsB0
>>493
Adobe PDF Reader コントロールです。
2019/07/28(日) 16:34:10.62ID:19w4dfv20
>>531
Excelのバージョン違うけど俺も同じエラー出たからWebBrowserコントロールで表示させた
2019/07/29(月) 21:45:38.25ID:CSar0obtd
https://i.imgur.com/7ssVURS.jpg
2019/07/30(火) 10:04:06.46ID:/sOZLFOB0
for i = 2 to 6
Sheet1.Range(cells(i, 1), cells(i, 7)).Value = Sheet3.Range(cells(2, 1), cells(2, 7)).Value
next i
これがエラー吐くんですがどうしてだかわかりますか?
なおコードは簡略化してあります。エラーが出るところだけピックアップしてみました。
2019/07/30(火) 10:21:39.52ID:RYwsY7rK0
セルの結合などで配列が作れないとか?
2019/07/30(火) 10:27:09.85ID:/sOZLFOB0
セルの結合はしてないです
2019/07/30(火) 10:38:34.52ID:7eiKBQzd0
cellsにもシート指定する
2019/07/30(火) 10:56:49.73ID:/sOZLFOB0
流石です。できました!
2019/07/30(火) 11:21:54.97ID:/sOZLFOB0
もうひとつ質問です。
エクセルは24時を越える時間をセルに入力するとセルの頭に1900/1/1とついてしまいますがこれを消す方法はないでしょうか。
具体的には
Range("d2").Value = DateAdd("s", 14405 * (cells(2, 7).Value + 1), cells(2, 3))
とやって4時間の倍数を計算したとき24時を越えると時間の前に1900/1/1がついてしまいます。
これがついたときこの1900/1/1の部分を消したいのです。
例えばright関数を使って右の時間の部分だけとろうとしてもシリアル値がコピーされるのか、上手く行きません。
2019/07/30(火) 11:25:40.51ID:/sOZLFOB0
なお書式設定でhh:mm:;ssとしているので見かけ上はちゃんと時間だけ表示されます。
この時間をソートしたとき頭に1900/1/1がついた時間が後ろに回りこんで困っています。
2019/07/30(火) 12:41:51.17ID:q4AvHDZpM
>>54
> この時間をソートしたとき頭に1900/1/1がついた時間が後ろに回りこんで困っています。
そりゃ24時間超えてるんだから下に来るのは当たり前
取り敢えず簡単にやるなら
Range("d2").Value = Mod(DateAdd("s", 14405 * (cells(2, 7).Value + 1), cells(2, 3)), 1)
の様にして少数部だけにすればいい
ちゃんと知りたいなら
Excel シリアル値
あたりでググってくれ
2019/07/30(火) 19:06:59.93ID:WgMpTdZUd
どれも初心者が陥る有りがちな罠。
中級者以上なら皆知ってる。
2019/07/30(火) 19:48:55.40ID:/sOZLFOB0
>>541
mod関数を使って余りを求める発想は恐れ入りました。
しかし、コピペで上手く動作しなかったので、シリアル値が1以上だと表示されることに注目して
if文を使って1以上ならシリアル値から−1するようにコードを書き換えました。
今のところ上手く動いてますがmod関数を使った余りを求める方法のほうが遥かにスマートなので
試行錯誤しながらmod関数を取り入れてみたいと思います。
ありがとうございました!
2019/07/30(火) 20:02:47.84ID:q4AvHDZpM
>>543
まあ本来modとか剰余とかは整数にしか定義されてないからExcelがちょっと異常だと思ってた方がいいと思うよ
2019/07/30(火) 20:27:28.12ID:AKu0TaFKM
>>544
IEEEの剰余演算知らないのか
素人丸出しだな
2019/07/31(水) 06:47:02.32ID:xZH8peU8M
すきあらばマウンティングとかw
2019/07/31(水) 07:02:37.78ID:Pk+8r5fC0
マウント関数
2019/07/31(水) 13:15:14.27ID:d2gdTfTi0
>>532
やっぱりそうなりますか。
僕も代替策でWebBrowser使ってるのですが、こういうの気持ち悪くて。
WebBrowserだと印刷とか拡大のボタン出てきちゃうし。
2019/07/31(水) 22:27:47.84ID:bMN05+Sd0
時間を24以上にしたいなら
表示形式で[hh]:mmみたいに角括弧つける方法もある
2019/08/01(木) 06:52:12.88ID:dXXftso1M
>>549
ソートするとおかしいと言ってるからそれ関係ない
>>545とかもそうだがチンケな知識自慢はウザイだけ
2019/08/01(木) 22:46:09.22ID:DllCcR/k0
時刻が昇順に見えなくておかしいなら[hh]:mmで昇順に見えるよ
2019/08/01(木) 23:23:27.20ID:nCBAvKB70
コールバック関数をどういう状況で使うのか分からないんですけど、
↓こんな状況で使う、で合ってますか?

Sub Test()

 この中で、関数Aを実行したい場合と、関数Bを実行したい場合がある。
 If文で、関数Aと関数Bを分岐するのは嫌。

End Sub
2019/08/01(木) 23:25:07.45ID:i4bRK0c30
今すぐ実行しないけど、何を呼ぶかは今決めておきたい時
2019/08/02(金) 00:58:24.36ID:EdsLlVlVa
依存関係を逆転するんだよ
AがBを呼ぶ場合、普通はAがBに依存するだろ?
コールバックやインターフェイスを使うことで、AがBに依存しないままでBを呼ぶことができる
それによりAを変更することなくBを別の実装Cに差し替えることが可能になり、Aの再利用性が高まる
まあVBAにはそんな小難しい概念は全く必要ないから忘れていい
2019/08/02(金) 06:30:07.60ID:8FKwQRXt0
コールバックは非同期だとめちゃくちゃ便利だけどvbaみたいに一本の処理が続く言語ではあんまり意味が無い
独自関数のイベントハンドラすら無いなら尚更
2019/08/02(金) 13:06:20.71ID:CGHTW3BLd
コールバックは非常に重要なんだけどVBAで出てくるのはサブクラスやフックなんかの高度な話の時や、コールバック使用を前提とするWin32APIの時だな。
2019/08/04(日) 15:16:30.47ID:5ZS1G+AH0
・Microsoft HTML Object Library
・Microsoft Internet Controls
これらを参照したプログラムを社内で組んで使っています。

ベースとなるIE上のページにあるいくつかのリンク先から必要な情報を
とりだしてワークシートに並べるだけの単純なものです

これまでWindows7(64bit)+Excel2010だったのですが
Windows10+Excel2016に近々移行するという話が出ています

そのまま使い続けられたらいいなと思っているのですが、
何か明らかに問題となるような事項はご存じでしょうか?

自分で組んだものなので、修正はできるのですが、アクセスしにくい場所にあるので
事前に知っておくことができれば対応しやすいなと思っています
2019/08/04(日) 15:50:09.98ID:VJisWwvJ0
>>557
Win10+IEでは、IEのプロセスがしばらく消えなかったり、読み込み完了してもReadyStateがきちんと変化しなかったりで、移行にはかなり苦労すると思われる
俺はすごく苦労した
2019/08/04(日) 17:49:24.07ID:5ZS1G+AH0
>>558
その辺は移行後じゃないと分からなさそうですね
一旦使用中止した上で確認することも考えます
ありがとうございます
2019/08/04(日) 18:18:52.51ID:wM8jMXaC0
IEオブジェクトはそろそろやめた方が良いね
2019/08/04(日) 18:58:46.79ID:6Wul5V0eM
読み込み完了を確実に知る手段がないからなReadyStateあてにならないし
2019/08/04(日) 19:10:37.00ID:wM8jMXaC0
ajaxがあるともう無理
2019/08/04(日) 19:47:17.29ID:VJisWwvJ0
>>561
実は方法はあるんだけど、あんまりスマートじゃないんで他人の使うアプリでは採用しづらい
2019/08/04(日) 21:08:59.72ID:ct85luz10
On Error〜 と Do Loop ?
2019/08/04(日) 21:21:12.54ID:wM8jMXaC0
doloopで取得する方法って無限ループになりそうで怖い
2019/08/04(日) 23:22:30.08ID:wIzeuvQb0
Excelでソースを見られないようにする方法はありますか?
プロジェクトのパスワードはすぐに突破されるので
2019/08/04(日) 23:24:28.94ID:wM8jMXaC0
無いよ
2019/08/04(日) 23:25:56.68ID:wM8jMXaC0
と思ったけどスマン
dllにして読み込む形なら結構行けるんじゃないかと思った
5691=”ー1”、Null=”” (ワッチョイ f5ad-zwOC)
垢版 |
2019/08/05(月) 02:53:35.25ID:nP4zzQcy0
見た目比較、柔らか比較、直観比較、なんて言うんでしょうね?
どうググればいいのか
スレチなのかどうか
VBAに限らず、C#でも結局、空文字連結が最良だった印象
でも問題にしたい基本はExcel VBA

 If A & ””=B & ”” Then

というのは、数字を1セルずつ入力すると数値になるけど、配列でまとめて入れると文字になったり
でも単純に「1」なら「1」なのだとしたい場合

ちなみにCStrはNullでエラーになるので&””の方が便利
便利だけでなく、速度も圧倒的に&””の方が速い
(ちなみにセルのTextプロパティもめっちゃ遅い)

ちなみにセルをString変数に代入してから比較する方が、&””より1〜2割速い
セルにNullを入力しても空文字になるので、セル側には使える
でも用途限定&ソース増えるので、よほどの大量処理で困らない限り、一般的には&””が安定かな

でも昔、「なんで空文字連結してるの?」って誰かに怒られたことがあり、なんとなく後ろめたい
でもテストを重ねるうちに例外に気付き、最初からやっときゃ良かったじゃんとなる

どうなんですかね?
2019/08/05(月) 02:54:38.57ID:nP4zzQcy0
あれ、1=”ー1”ってなんだw
1=”1”ね
2019/08/05(月) 06:35:19.95ID:fZ1grq280
>>569
型変換のために空文字列を連結したり0を足すのは、ワークシート上ではよくやるけどVBAでは避けた方がいい
セルの表示内容を文字列で欲しい時はTextプロパティを使うのがセオリーだし、自分でも書いてるけどString型の変数に代入するべき
2019/08/05(月) 09:21:52.72ID:DamzU/6ud
>>571
Textプロパティは使わねえな。
2019/08/05(月) 11:48:01.13ID:9MgYLk7e0
>>558横からすみません
すごく苦労した部分の詳細や対応策を教えていただけないでしょうか
2019/08/05(月) 13:25:50.95ID:fZ1grq280
>>573
俺が試行錯誤の末に発見したのは、IEオブジェクトのVisibleプロパティが変化するとReadyStateが更新される、ということ
だから

objIE.Visible = False
objIE.Visible = True

という2行を読み込み完了チェックのループに挿入した
あと、IEが非アクティブになるとエラーで止まることがあるので、マクロ実行中は一切さわってはいけないという制約まで付く
ここまでやって、画面がものすごい勢いで点滅するけど、一応の結果は得られるようになった
あと、Win10の次の大型アップデートでIEの動作がまた変わるかも知れないので、いつまでも使える保証がない

JavaScriptやcookieやセッションの管理などが必要なければXMLHTTPを使った方が簡単で確実
575デフォルトの名無しさん (ワッチョイ 75f1-xVkp)
垢版 |
2019/08/05(月) 14:36:12.11ID:RvbOnux20
タブブラウザで新しいタブに追加する方法はあれから発明されましたか?
2019/08/05(月) 16:28:51.96ID:9MgYLk7e0
>>574さん
ありがとうございます

すごい参考になりました
時々ReadyStateが更新されずDo-Loop抜けずに困っていました
577デフォルトの名無しさん (スッップ Sd43-nSnx)
垢版 |
2019/08/05(月) 18:35:15.20ID:nHSuKmq3d
今でもIEなんて使ってるのお前らだけだろ
あんたの会社はセキュリティとか気にしないんだね
2019/08/05(月) 18:46:21.41ID:u4C0UjsS0
>ここまでやって、画面がものすごい勢いで点滅する
なると思ったけどやっぱりなるんだ

>>577
ブラウザの解釈が必要なところはどうしてもあるんだよ
ただのスクレイピングでいいなら色々な方法があるけどやっぱりキツイ
2019/08/05(月) 19:20:06.57ID:VaXANPIk0
textプロパティ遅いからデータ量が多くない時しか使えない
2019/08/05(月) 19:34:11.66ID:VaXANPIk0
>>569
セルに数字入れたら文字になるというのは、RangeのValueに入れてるからとかでは
2019/08/05(月) 19:55:00.01ID:u4C0UjsS0
>>569
自分一人しか見ないならどっちでも良いよ
他の人への見やすさを考えると関数の方が良い
文字列連結で考えられるのは
・仕様を検索し辛い。str()なら一発で見つかるが、文字列連結によるエラーなどはどう探していいのか分からん
・そもそも何をしているのかも分かりづらい。本来は文字列を入れるつもりだったようにも見える
・この記述でどういうエラーや分岐が発生するか不明。nullやDATE型が入ってる場合など

見た目比較
tostring = Str(1)
tostring = 1 & ""

どうしても使いたいならコメントをつけるなどした方が以下も知れないけどこれもアホらしいな
tostring = 1 & "" '文字列化
2019/08/05(月) 20:12:10.62ID:VaXANPIk0
str(1)は"1"にならない
strは符号付文字列化だから
2019/08/05(月) 20:48:05.94ID:u4C0UjsS0
あぁCstrじゃないとダメなんだっけ
ずっと忘れてたわありがとう
今までのコードかなり間違えてる気がする
2019/08/05(月) 20:55:56.77ID:bZJ9L0Ead
良く使う文字列変数名ってみんなどんな?
2019/08/05(月) 21:21:35.78ID:u4C0UjsS0
名前やら住所やら普通に2バイト変数名使いまくる
2019/08/05(月) 21:29:12.71ID:VaXANPIk0
>>584
ちょっとしたテスト用ならs
それ以外は何の文字列かがわかる名前
2019/08/05(月) 21:48:48.29ID:9MgYLk7e0
>>577
IEの代わりに何を使っているのですか?
2019/08/05(月) 22:39:27.27ID:eFIMT7Jx0
仮にIE使えなくなったら、どうすりゃいいんだろう?
UIAutomationでも使うの?
2019/08/05(月) 23:06:57.61ID:fZ1grq280
>>588
原理上は、EdgeでもChromeでもどんなブラウザでもVBAや外部アプリから操作できる
あとは必要なライブラリのインストールが許可されるかどうかで決まる

とりあえずEdgeは簡単にコントロールできるよ
https://www.ka-net.org/blog/?p=6018
590デフォルトの名無しさん (ワッチョイ 75f1-xVkp)
垢版 |
2019/08/05(月) 23:11:08.42ID:RvbOnux20
タブブラウザで新しいタブに追加する方法はあれから発明されましたか?
2019/08/05(月) 23:14:43.05ID:u4C0UjsS0
>>590
その操作必要?
二つオブジェクト作れば良いと思うけど、ダメなのか
592デフォルトの名無しさん (ワッチョイ 75f1-xVkp)
垢版 |
2019/08/05(月) 23:41:12.85ID:RvbOnux20
ウインドウが二つになってしまうんですよ。タブじゃなく。
2019/08/06(火) 01:47:40.96ID:jLnmJ2DC0
DOSは演算子で分かれてるんだよな
==は文字、EQUは数値
&””が高速なら、専用演算子があればもっと高速になるような
ちなみにStrCompも遅いし、Nullはエラーになる

ちなみにDOSもNull問題と似たような<ECHO は OFFです。>問題があって、
やはり”%HOGE%”==””みたいな、文字連結しながらが標準
2019/08/06(火) 01:52:00.75ID:nCnvS7DE0
echo.%abc%
2019/08/06(火) 05:36:32.23ID:GHPQhf970
全角英数字やめようよ
2019/08/06(火) 07:12:51.81ID:vRSgvXkj0
>>589
あまりにコードが長いので、Pythonにするわ。
597デフォルトの名無しさん (ワッチョイ 75f1-xVkp)
垢版 |
2019/08/06(火) 10:15:51.32ID:AyLoeOe80
タブブラウザで新しいタブに追加する方法はあれから発明されましたか?
598デフォルトの名無しさん (ワッチョイ ad7c-nSnx)
垢版 |
2019/08/06(火) 11:43:42.12ID:fqxmaW9H0
VBAからJavascriptを操作
2019/08/06(火) 12:11:42.24ID:ANeL+6+I0
>>595
半角カタカナもな・・・
2019/08/06(火) 19:08:40.09ID:kWi2YXzG0
zenkaku mojimo yameyouze
2019/08/06(火) 22:24:53.84ID:nCnvS7DE0
Win95のハンカクからゼンカクになった時はえらく間抜けに見えたものだ
2019/08/06(火) 22:44:49.97ID:Uq1zh0Vl0
?
2019/08/07(水) 23:19:02.03ID:OP2ywupH0
JSObjectのaddAnnotで、PDFに注釈付けてるんだけど、
getProps → プロパティ変更 → setPropsで、
何故かtextSizeだけが反映されない。
他の、strokeColorやcontentsは反映されるのに。
何でだろう?
エラーも出ないし。
直接setPropsなら設定出来そうなんだけど、
引数の順番がわからん。
2019/08/07(水) 23:21:30.53ID:OP2ywupH0
↑ちなみに、typeとtextSizeを同時に設定しようとすると、サポートされていない云々のエラーが出るので、
先にtypeを設定してからtextSizeを設定するようにしてる。
2019/08/07(水) 23:49:11.47ID:OP2ywupH0
↑解決はしてないんだけど、おそらくこれしか無いだろうと思われる答えを見つけたので、一応自己解決。

ググったら、海外でも同じ現象が起きている人が何人かいて、
自動翻訳を頼りに調べたら、「そこだけJavascriptで書け」ってのが答えらしい。

なんでだよwwww
2019/08/09(金) 02:28:12.10ID:Sa/tT/Cw0
マウスが滑って列幅やグラフをいつのまにかズラしてしまう心配

ActiveSheet.Protect Contents:=False, UserInterfaceOnly:=True
どうも、Contents:=True にしないと列幅固定できない様子

でも Contents:=False にしないと、
ActiveChart.Axes(xlValue).MaximumScale = 100
こういうのでエラーになる
(DrawingObjects:=True は関係ないっぽい)

とりあず Contents:=False でグラフのズレだけは防止できるので列幅は諦め中
Workbook_SheetActivate で保持して Workbook_SheetDeactivate で戻すとか
そういうことはなんとなくやっちゃいけない気がする
2019/08/09(金) 22:26:35.64ID:6C2oLUnF0
グラフはなぁ・・。
間にDoEvents挟むと収まる謎のエラーとか、ワケワカラン。
2019/08/09(金) 22:39:48.74ID:HA0wV+Cx0
DoEventsはExcelでなんか処理がたまってメモリが爆発するのを回避してるんだろうなぁとかポインタが暴発してるのかなぁとかふんわりと考えている
2019/08/10(土) 15:00:29.70ID:70gCQNsL0
配列に、大量のセルの値を一気に入れると、メモリ不足のエラーが出るけどさ、
行が65536から1048651に増えた時点で、やばいって気づかなかったんかい!
2019/08/10(土) 15:01:14.35ID:70gCQNsL0
すまん、雑談スレと間違えた。
2019/08/10(土) 15:41:05.83ID:UG670C7Ka
VBAは既に非推奨になっていて今後改良されることもExcelの仕様変更に追従することもない
ヤバいとしたら未だにVBAを使っていることがヤバい
2019/08/10(土) 16:12:09.58ID:6zXh0uMNM
Excelに標準でついてるから使ってるだけ
2019/08/10(土) 16:39:23.75ID:uXgY3OKMM
>>611
>VBAは既に非推奨になっていて
詳しく
2019/08/10(土) 19:55:14.58ID:Um+tCRmgr
Excelにpythonが載るらしい事と関係ある?
2019/08/10(土) 20:56:10.58ID:JqqZRPld0
乗らないよ
アドインで作るならpythonせもC3でも書ける
2019/08/12(月) 08:16:20.47ID:rWCvfjYy0
環境の仕様上、仕方なくexcel_vbaからedgeを操作するコードを書く必要があります。
ieのようにcom?ole?オートメーションより操作する方法が用意されていないことが分かりました。

結果的にwebdriver経由以外は操作不可という認識です。
>>589の方も書かれている通りなのですが、
楽をする意味でもseleniumbasic+webdriverの組み合わせが最善なのでしょうか?
617デフォルトの名無しさん (スプッッ Sdfa-k+MG)
垢版 |
2019/08/12(月) 08:43:02.45ID:jMLB7Ls7d
>>616
Javascriptにしとけって
なんでわざわざ難しくするのか理解出来ない
2019/08/12(月) 08:49:36.79ID:pwPFXa0Y0
jsを管理ツールにぶっこんで動かすほうが100倍早そう
619デフォルトの名無しさん (ワッチョイ 7df1-6/mF)
垢版 |
2019/08/12(月) 09:35:57.54ID:DZttgA6c0
Jacascriptならタブブラウザのタブにページを追加することはできますか?
2019/08/12(月) 10:01:18.74ID:pwPFXa0Y0
>>619
一行
window.open('http://www.yahoo.co.jp', '_blank');
2019/08/12(月) 10:03:33.42ID:1s6J+agPa
「環境の仕様上、仕方なく」って
そんなに難しい日本語だっただろうか?
JavaScriptは理解出来ても日本語が弱いなら
とりあえずJavaScript板から出て来るなと
622デフォルトの名無しさん (ワッチョイ 7df1-6/mF)
垢版 |
2019/08/12(月) 10:06:01.90ID:DZttgA6c0
>>620
ありがとう。ところでVBAからJavascriptはどうやって呼び出すのですか?
2019/08/12(月) 10:15:28.94ID:pwPFXa0Y0
>>621
回答してあげれば?

>>622
あぁ、すまん
JavaScript疑似プロトコルを使うのが楽だと思う
https://www.vba-ie.net/ie/javascript.php

「IE(InternetExplorer)のJavascriptを実行するサンプルコード」
の部分

要はURLに
javascript:〜
とjsコードを書いてページ遷移させようとするとコードを実行できる。もちろんページ遷移はしない
2019/08/12(月) 15:17:47.26ID:w42U52pdd
>>616
COMオートメーションで操作できる。
Edge内の部分にIE相当がいる。
2019/08/12(月) 15:22:43.84ID:w42U52pdd
internetexplorer_serverがその部分。
2019/08/15(木) 07:57:00.06ID:itT4sC0lp
IEページ内の特定文字の表示されたリンクをクリックする簡便な方法ありませんか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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