Excel VBA 質問スレ Part59

■ このスレッドは過去ログ倉庫に格納されています
2019/02/09(土) 15:12:30.70ID:3lTArmdf0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part58
https://mevius.5ch.net/test/read.cgi/tech/1542577644/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/03/06(水) 21:34:55.08ID:LIhekGiK0
例のA列は↓の間違いです、すいません
1 2019/3/6
2 20:04
3 \10,000
2019/03/06(水) 21:37:03.61ID:o9MkSJEKa
画面表示を止めても遅い?
2019/03/06(水) 21:54:06.80ID:ZuXoITq7x
>>673
列インデックスで加算ループをしている途中で列削除をしてるから、削除した回数分だけ参照参照列の位置がおかしくなるのでは
例えば2列目を削除した後にループ処理の最初の処理に戻ると、次にi=3として.Cells(1,3)とセルアクセスしたときに見ることになるのは本来D1に位置していたセルになる
列削除した分インデックスがずれるので


こうやって減算ループにするのが正解の一つかと

Sub 不要列削除()
Dim i As Long
For i = 5 To 1 Step -1
If Cells(1, i).Value <> "あ" Or Cells(1, i).Value <> "う" Or Cells(1, i).Value <> "お" Then
Columns(i).Delete
End If
Next
End Sub

あるいは、列削除した場合にはEnd Ifの手前でiから1を引いてインデックス調整するようにしたりか
2019/03/06(水) 21:56:07.90ID:ZuXoITq7x
>>673
改めて見たらIfの条件もおかしいね
And条件にしないと
2019/03/06(水) 22:13:28.72ID:0dxLNo3Q0
馬鹿過ぎるのが問題
2019/03/06(水) 22:23:00.33ID:R/1sU7PR0
>>675
textプロパティ

Sub foo()
Range("c1").Value = Range("a1").Text
End Sub

範囲で代入は出来なかったので、適当にforeachで回してくれ
Range("c1:d2").Value = Range("a1:b2").Text
2019/03/06(水) 22:36:44.70ID:LIhekGiK0
>>677
止めた状態で遅いです

>>681
セルに直接入力していくと更に遅くなると思います
2019/03/06(水) 22:56:49.85ID:xGO4PHc60
CSVで書き出せばTEXTが得られるぞ
2019/03/06(水) 23:08:59.57ID:R/1sU7PR0
>>682
あぁtext使ったって書いてたね、ゴメン
配列でも無理なら高速化はどうだろうか
https://15g.jp/post-314/

高速化でも配列でも重いなら、
もうアクセス辺りに移行した方がいいかも
2019/03/06(水) 23:09:20.80ID:R/1sU7PR0
>>683
csvは勝手に変換されるのが鬼門すぎる
2019/03/06(水) 23:48:56.32ID:LIhekGiK0
やっぱりTextプロパティ使う以外無理そうですかね…
2019/03/07(木) 00:01:59.48ID:UepKFInK0
後は>>683かな
住所の"1-1-1"みたいなものがなければ行けると思う。
後はダメ元でgoogleスプレッドシートに移植してマクロ組んで見るとか
2019/03/07(木) 00:20:00.91ID:UmWyYgm40
>>686
textの取得だけループでまわして、
二次元配列に直して代入するとかは?
2019/03/07(木) 00:26:34.58ID:bl5ieqXF0
>>688
遅いって書いてあるだろ。もっと上をお望みなんだよ
2019/03/07(木) 00:44:39.67ID:UmWyYgm40
>>689
直接入力が遅いって言ってるから、入力だけ一括でやれば?と思ったんだが
2019/03/07(木) 00:46:43.69ID:zt2fCEgu0
>>687
他のファイルは使えない状況なんです…

>>688
その処理がすごく時間がかかるので他の手段を探していました

諦めます
今回の事でRangeのValueやFormulaみたいにTextも配列に入れられるようにしてくれと心から思いました
色々考えてくれたみなさんありがとうございました
もしいい方法思い付いたらいつでも待ってます
2019/03/07(木) 01:15:09.98ID:UmWyYgm40
描写と計算止めてCopyメソッドで10万行×30列を列ごとにコピペしたら一瞬で終わったが・・・
っていうかこれ以上増やそうとするとリソース不足でエクセルが悲鳴を上げるし、どういうデータをコピーしたいんだろ
2019/03/07(木) 01:18:31.96ID:UmWyYgm40
あ、書式変わるのか・・・上のレスは忘れてください
2019/03/07(木) 02:33:57.63ID:cMWEbvvB0
コピーしてテキストとして貼り付けじゃダメなのか?
2019/03/07(木) 02:58:39.40ID:Wb+CU65ma
早い遅いは個人の感覚でしかないとおもう
2019/03/07(木) 07:14:54.02ID:RImgiSgC0
>>691
>>684 の Application.ScreenUpdating = False
は効かないのか。 画面描画が止められるよ。やってないから適当なこと言ってるかもしらんが
画面描画以外で時間がかかるってどんなだよ。 ちょっと想像できんがなあ
なんでだろう
2019/03/07(木) 07:24:21.94ID:ldY6B6U1d
>>691
valueで配列コピペした後に、セルに対してそれぞれ書式設定を手動もしくはマクロですれば?
書式は列ごとくらいは揃ってると思うし。
それもバラバラってことだと、そもそも集計の仕方が悪過ぎる。
2019/03/07(木) 07:28:16.03ID:IFVQ3Zq/0
>>674 >>678
ありがとうございます!
意図するようになりました。
-1で減らしていく発想は本当になかったのでいい勉強になりました。
このたびは本当にありかございました。
2019/03/07(木) 07:44:13.43ID:ldY6B6U1d
>>696
684じゃないけど、複雑に関数組んだりとか遅い関数が大量に入っててかつデータ数がエクセル上限近くで再計算に時間がかかるとか、あとセル上で反復計算やソルバー使ってたりするとある。
ただ684は書式がバラバラなセルを扱ってる時点で、複雑な計算をしてるとは思えないけど。
2019/03/07(木) 07:52:53.03ID:RImgiSgC0
>>699
>>675をもう一度見て来いよ。 これだぞ。そんなややこしいことしている話ではないと思うが

>表示形式が混在したセルを見た目通りのまま表示形式が文字列の別のセルにコピーするいい方法ありませんか
2019/03/07(木) 08:38:04.86ID:QURDMn8Xd
再描画等定番の部分は止めています
セル数は100万ぐらい、列数、行数分回してTextプロパティを1セルずつ配列に入れる処理だけです
シートへの貼り付け処理ではなくこの取得部分に時間がかかります
同じ回数回すAや、Format関数、worksheetfunction.textを使った場合その半分以下の時間ですが望みの結果を得る方法はわかりませんでした…
2019/03/07(木) 10:57:17.39ID:QGzmAmpt0
コピーした後NumberFormatで整えればええんちゃうん?
Dim buf() As Variant
buf = Range("A1:A3").Value
Range("B1:B3").Formula = buf
Range("b1").NumberFormat = "yyyy/m/d"
Range("b2").NumberFormat = "h:mm"
Range("b3").NumberFormat = "[$\-ja-JP]#,##0;-[$\-ja-JP]#,##0"

データが多すぎて無理?
2019/03/07(木) 10:58:23.63ID:QGzmAmpt0
アー、見た目が同じまま、「文字列」なのか・・・
すんません無視してください
2019/03/07(木) 11:39:04.19ID:OUaGUe4hM
>>675
A1:A3をコピーしてメモ帳とかに貼り付け
全選択してコピーしてB1:B3に貼り付けでできた
VBAだけで完結させる方法は知らん
2019/03/07(木) 12:41:45.56ID:g1Ak82VsF
勘違いしてる奴が多いが、自動計算を止めたり描画を止めるのは初心者が速度アップのためにやる方法で、>>675のように速度アップの為に考えて組まれている場合には効果が無い。

上級者はこういう場合に描画止めたりしないよ。
考えずに組んで面倒くさい場合にやる奴はいるかもしれんけど。
2019/03/07(木) 12:42:12.66ID:QURDMn8Xd
>>702
あとからNumberformatを適用させるんでなく配列に入れる時点で適用させる手を考えたんですが、
適用させるのにworksheetfunction.textを使うと書式に「マイナス値は[赤]」みたいな色設定があるとなぜか1004エラーが出るし、Format関数使うと表示形式が標準の時なぜか値が「標準」という文字列になってしまいます
速度的にはtextプロパティ使うよりずっと速いんですが…もう訳がわからない
2019/03/07(木) 12:46:54.74ID:g1Ak82VsF
>>675
他に方法があるか探る時間が無いので何とも言えんが、DB処理にするか、マルチプロセスで上手いことすれば早くなると思う。
2019/03/07(木) 12:50:28.91ID:g1Ak82VsF
よく考えたらDB処理は駄目な気がする。
表示部分を扱え無さそうだ。
2019/03/07(木) 18:02:24.90ID:6oCjCAip0
メモ帳にコピペすると書式が全部消えて見た目通りの文字列になる
メモ帳アプリの実体はエディットコントロールそのものだから、ユーザーフォームにエディットコントロールを貼っただけの作業場所を作って、そこ経由でコピペしてみたら?
2019/03/07(木) 18:03:18.10ID:hp531q160
UserForm1にTextBox1とCommandButton1、TextBox2とCommandButton2の計4つが配置され
UserForm2には入力フォームが配置されています。

CommandButton1からUserForm2を呼び出した時は、TextBox1に記入
CommandButton2からUserForm2を呼び出した時は、TextBox2に記入

させるには、どうすれば良いですか?
2019/03/07(木) 18:34:04.34ID:rXPjoswtF
>>709
これ、本当?
だったらクリップボード弄って高速化できるかもしれない。
2019/03/07(木) 18:34:43.55ID:qs1KmWLa0
複雑な処理でデータ量が多いなら遅くても仕方ないんじゃね?
どうせエクセルだし、専門職じゃないし、大した会社じゃないし、給料安いし
2019/03/07(木) 19:03:35.19ID:qo/Sl71gx
>>710
やり方はいくつもある
一番簡単な方法を書くと、

Userform1側の各ボタンのクリックイベント内に、任意のセルや標準モジュール上のPublic変数等にコマンドボタンのオブジェクト名をコピーする処理を書く(Me.ActiveControl.Nameでフォーム上でフォーカスされているコントロールオブジェクトの名前を取れるのでこれを使う)

Userform2側のイベントコードではそのコピーされたボタン名を読み取って書き込み先のテキストボックスを判定するようにする
2019/03/07(木) 19:11:06.28ID:ximLdO0ya
>>710
コマンドボタンのクリックイベントプロシージャで、グローバル変数に呼び出したボタン番号を格納→ユーザーフォーム2のコンストラクタでグローバル変数で分岐させる方法

もしくはコマンドボタンのクリックイベントプロシージャでユーザーフォーム2のマルチページコントロールのプロパティを変更する(value=1,2)方法もある
2019/03/07(木) 21:34:32.55ID:zt2fCEgu0
セル範囲をコピーしてクリップボードから直接二次元配列に入れるようにしたら何十秒もかかってたのが0.5秒になりました
ただ、クリップボードから切り出す時にうっかりセルの値に手を加えてしまわないかが心配です
単純にVbCrLfで行を区切って、VbTabで列を区切ってるんですがそれで問題ないんでしょうか?
2019/03/07(木) 22:48:37.99ID:6oCjCAip0
>>715
セル内改行を使ってなければそれで大丈夫
2019/03/08(金) 00:03:05.83ID:+kJkkfKW0
>>716
セル内改行入れてみたら…またこんな落とし穴が…
2019/03/08(金) 02:12:12.40ID:k3BFo3Xw0
>>713
>>714
プロジェクトが大きくなるにつれグローバル変数は神経を使うので
極力さけたかったのですが
Form1.ActiveControl.Name、でいけそうですね
2019/03/08(金) 03:08:04.26ID:Tjqa7GxLa
システムの大規模化が想定されるならユーザーフォームでユーザーフォームを呼び出すのは危険w
ユーザーフォーム間の依存性を高めてしまうw
ここはユーザーフォームを呼び出すクラスを作った方がいいw
クラスを介して情報を渡せば安全だし再利用性も高まるw
2019/03/08(金) 08:00:14.88ID:IUpgvQZO0
やっぱりuserformからuserform呼ぶのってよくないのか
こういうのってクラスモジュール使えるんだろうなって思ってたんだけど
余り使ったことなかたんで、ちゃんと勉強してみよう
参考書ぽちってきたわ
JavaとかC#を多少触ってきたからオブジェクト指向の概念は分かってるんだけど
VBAでの効果的な使い方をマスターしたいわ
2019/03/08(金) 08:01:46.46ID:aYiBhvGax
引数付きコンストラクタすら簡単に実装できない言語で呼び出し用クラス作る方がきついと感じてしまうね、個人的には
2019/03/08(金) 08:08:56.71ID:IUpgvQZO0
普通のコンストラクタには引数渡せないんだ
まぁその辺の限界も含めて一度勉強しておいたほうがいいとは思ってる
できることと出来ないことを知った上で、クラスを使う選択肢を持つことができればいいかなって
2019/03/08(金) 08:15:50.67ID:nNie5CZRM
VBAでクラスとか言ってるのはたいてい知ったかだからスルーしていい
VB.NETとかC#知ってたらストレスしかたまらん
2019/03/08(金) 08:23:55.15ID:URVXf1I+a
そもそもVBAにクラスが欲しくなるような規模の要件を押し付けている時点で業務設計が破綻してる
2019/03/08(金) 08:24:18.53ID:wvJFI7ubd
こういう場合にクラス使うの?
何か違うと思うんだが。

VBAでも見た瞬間にクラス使おうと思う場合もあるんだが、そういうことは少ないな。>>323のような話なら見た瞬間にクラスだなと思うんだけどね。
2019/03/08(金) 08:43:43.11ID:URVXf1I+a
>>725
ワークシート上でデータが常に単なる二次元の表として見えているために、
その行をエンティティとして見るような発想になりにくいんだろうね
別にそれが悪いとは思わないが
2019/03/08(金) 08:55:03.19ID:GpWg6Xx2M
逆にいうと、ワークシート上で人間が無理なく扱えるようなデータ構造にならざるを得ないから、
生え抜きのVBerが作りがちな酷いDB設計になりにくい
そういう良い意味でデータ構造に無理が利かないので、クラスでデータ構造を抽象化したくなるケースが少ないのだと思われる
2019/03/08(金) 12:25:06.22ID:3iX4ejeoF
DBとして扱うならクラス使うことも考えるよ。
でも、DBとして扱うことも多くない。
DBならAccessにしちまうんで。
2019/03/08(金) 16:46:49.91ID:YR0R2o1EM
いまAccessを使う理由って何?
無料版のSQL Server のスペックの方が上だろう。
移行が大変だから?
2019/03/08(金) 16:53:49.99ID:84JrbWWM0
エンジンだけで比べてる頭の不自由な人かな?
2019/03/08(金) 16:53:54.67ID:GpWg6Xx2M
フォーム中心のまともなデータベースアプリが比較的簡単に作れるという点では意味がある
まあ今ならPowerApps使えばいいと思うけど
2019/03/08(金) 17:59:29.39ID:uRP/bscvx
PowerApps使うならPowerShellかJScript使わないとな
まぁVBAは要らんわ
2019/03/08(金) 18:55:16.76ID:aTSUMsKkd
???
会社のPCに既にAccessがインストールされているのにもかかわらず、
Excelで扱うような程度のものをDBとして扱いたい時に、SQL Serverインストールはじめちゃう人?

全てにおいてセンスねーわ。
2019/03/08(金) 18:56:25.33ID:aTSUMsKkd
まだSQLiteの方が理解出来るわ。
2019/03/08(金) 19:18:32.09ID:rErY3KdLM
>>733
正直君の意見はよくわからん
Management Studioすごく便利だよ
それにExcel からADOやODBCでつつく際のIFは大して変わらないんだからSQL Serverの方がパフォーマンスいいじゃん
2019/03/08(金) 19:24:33.31ID:+kJkkfKW0
うちの会社そういうの入れる時はそれを使う理由説明して了解得るのに手間がかかる
2019/03/08(金) 19:46:50.70ID:iqA0OhOAd
まあ普通はセキュリティ部門にリクエストして審査通らんと入れるのは無理だわな
VBAも原則禁止だから毎回例外申請してるわ
2019/03/08(金) 21:38:31.98ID:quBQyQDX0
環境申請が必要な業務を未経験者にさせるほどうちの会社はブラックじゃない
2019/03/08(金) 21:38:33.69ID:84JrbWWM0
>>735
馬鹿はエンジンしか見ていない
2019/03/08(金) 22:23:14.58ID:AVEVGkz60
具体的な事を言えよ
2019/03/08(金) 23:50:58.19ID:84JrbWWM0
>>740
馬鹿には理解できんのか?
2019/03/09(土) 02:13:50.44ID:zk58FQoZ0
会社がoffice365に切り替わってAccess使えるようになった俺歓喜
2019/03/09(土) 02:15:54.88ID:w2C0D7DGa
accessはスレチ
744デフォルトの名無しさん (ワッチョイ de8c-91/d)
垢版 |
2019/03/09(土) 04:02:18.85ID:83GbxNdW0
accessって開発続いてるの?
Excelを強化してAccessを見放すように思えてしょうがない
745デフォルトの名無しさん (ワッチョイ b7f1-IjB2)
垢版 |
2019/03/09(土) 04:12:29.83ID:676zsyfX0
accessはウンコです
2019/03/09(土) 07:26:22.26ID:j4uu9hgX0
Acccessとか。 いつの時代の遺品だよって感じだな
使いにくかったしなあ
2019/03/09(土) 07:48:05.33ID:ABNsWlsO0
>>744
>>731も書いてるけどExcelとAccessって用途が違うから当面なくならないと思うよ
2019/03/09(土) 08:34:58.65ID:nDxlP6J/0
SQLとOracleとAccess使うと書き方混乱する
2019/03/09(土) 09:22:46.51ID:Z89d69KF0
シート上に複数のテキストボックスを配置して、
KeyDownイベント + vbKeyRightとかvbKeyTabで、
テキストボックス間を移動出来るようにすると、
カーソルがたまに見えなくなるんだけど、回避策ない?
見えないだけで、存在はしているので、
文字は打てるんだけど、文字まで透明になっちゃう。
テキストボックスを何回か適当にクリックすると、
突然見えるようになる。
2019/03/09(土) 09:24:00.36ID:Z89d69KF0
↑あと、わざわざ画面更新を止めたりはしていない。
2019/03/09(土) 09:29:10.33ID:Z89d69KF0
↑あ、別のPCで開いたら再現しなくなった。
もしかして、グラフィックボードの問題?
2019/03/09(土) 10:19:05.53ID:zk58FQoZ0
>>751
ボードと言ってるのはたぶんドライバのことだと思うけど、その可能性はあるよね。
いくつかバージョン違いを落としてきて試してみればいい。
とりあえずは、各メジャーバージョンが上がったばかりのは除いて、それぞれ最終リビジョンのを集めてきてかな
753デフォルトの名無しさん (ワッチョイ 1e90-R+To)
垢版 |
2019/03/09(土) 21:56:21.30ID:QAZD12fZ0
excel vbaとaccess vba
どちらの方が実用的ですか?
2019/03/09(土) 22:00:31.82ID:BnoVO+GEM
>>753
目糞鼻糞
今時ローカルで完結する業務要件なんかほとんどない
755デフォルトの名無しさん (ワッチョイ 1e90-R+To)
垢版 |
2019/03/09(土) 22:03:03.09ID:QAZD12fZ0
両方できて当たり前ですか?
2019/03/09(土) 22:06:43.06ID:vJsfVwnQ0
触り始めればすぐ覚えるよ
触る機会がexcelのほうが多いってだけ
2019/03/09(土) 22:20:16.59ID:BnoVO+GEM
>>755
Excelだけでいいよ
今時AccessやるくらいならSalesforceでも覚えなさい
2019/03/09(土) 22:33:56.74ID:u5Pk3KZwM
Accessに親でも殺されたのか? w
2019/03/09(土) 22:36:15.94ID:M4mulWlpM
>>755
超小規模ならExcel
テーブルの規模が大きくなってくるとAccess
Accessの何がいいかって言うとオレはレポートだと思ってる。あれを使いたいがために、オレはdbアプリ(フロントエンド)はAccess一択。
テーブルの規模がさらに大きくなってきたら、テーブルだけをoracle、SQLServerなりに移行。
そもそもAccessは大規模用ではないが、わかって開発すれば大規模用に寄せていくことはできる。
2019/03/09(土) 22:42:40.73ID:ouuI5dEha
>>758
シンプルに、需要がない
2019/03/09(土) 22:43:14.91ID:M4mulWlpM
>>759
Access一択は語弊があるけど、Accessだけで完結できるならAccess押し。
あとは顧客要望で、webなりc#なり様々
2019/03/09(土) 22:52:20.46ID:ABNsWlsO0
>>760
需要の無いものをMSがわざわざ開発して売ってるのかw
無職の妄想乙
2019/03/09(土) 23:38:00.61ID:ouuI5dEha
>>762
実際ほとんど放置されてるでしょ
そもそもAccessってノンプログラミングで専用アプリ風のDBアプリが作れるのがメリットなのであって、そこは全く否定するつもりはないけど
プログラミングするんなら他にもっと優れた選択肢はいくらでもあるよ
2019/03/09(土) 23:47:17.35ID:c6PO5ulL0
With Access ってやりたくなってきたな
2019/03/10(日) 00:26:33.47ID:AZoiY/Tr0
中小企業は普通にエクセル・アクセス
使える人間が多いのが最大のメリット。事務員だけでも割とどうにかなる

エクセルvbaは死ぬほど使う
アクセスはvbaじゃなくSQLを覚えたほうが良い
でもSQL覚えるのって結構たいへんなんだよよねぇ
2019/03/10(日) 00:34:07.81ID:/SA1VNEE0
とりあえずVBAはどっちでも同じだから、あとはどういう環境を用意されることが多いかと考えると圧倒的にExcelに縛られることが多いので実用で考えるとExcelだろうか
Accessでやる方が楽な時でもExcelでやらされることが多いし
2019/03/10(日) 00:37:17.38ID:AZoiY/Tr0
Accessは大抵前任者なりシステムなりが作っている場合が多いから、ほとんど触る事が無い
エクセルは事ある毎に0から作ったり改修する事多いからvbaはめっちゃ役に経つ
2019/03/10(日) 00:45:32.25ID:/1sFaTiS0
素人が作って不正統計したりするのもexcel
2019/03/10(日) 00:54:56.33ID:W5FlChvZ0
>>765
複雑になってくるとSQL知識は必要になるけど、クエリーデザイナ(QBEグリッド?)でほとんどできてしまう。
昔oracleでSQLゴリゴリ書いてたあとAccessのクエリーデザイナ見て「これ考えたやつ天才やな」とマジで思った。
選択も更新も削除も書けて、テーブル連結も表現できて、革命やなと。
2019/03/10(日) 01:10:02.43ID:HL2UVho30
accessで帳票画面作りが便利過ぎて
Excelにもレポートつけて欲しい
方眼紙神Excel化しまくり
2019/03/10(日) 04:21:41.33ID:RhjsjUYS0
>>763
お前がAccess知らんだけだろw
2019/03/10(日) 07:28:22.90ID:m5XGUhg5a
>>771
そもそも今時ローカル限定のDBなんてほとんど役に立たなくね?
ちなみに、https://support.office.com/ja-jp/article/ビデオ-access-web-アプリを作成する-10855ec0-3a12-4e6c-a67c-c88267f00a3c
> 重要 Microsoft では、SharePoint で Access Web App を作成および使用することはお勧めしなくなりました。 代わりに、Microsoft PowerApps を使用して、Web およびモバイル デバイス用にコードなしのビジネス ソリューションを作成することを検討してください。

だそうだよ
2019/03/10(日) 08:09:35.64ID:8TH6z4a90
Salesforceて。
クエリの自由度がAccess以下じゃん。
2019/03/10(日) 08:13:57.05ID:jNouaRswM
>>773
仮にそうだとしてもAccessより圧倒的にスキルの需要が高いのは事実だよね
それは何故だと考える?
2019/03/10(日) 08:46:12.12ID:RhjsjUYS0
>>772
まじでAccessに親でも殺されたのかよw
必死にググって探してきたんだろうけど見てて恥ずかしいぞ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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