Excel VBA 質問スレ Part58

■ このスレッドは過去ログ倉庫に格納されています
2018/11/19(月) 06:47:24.99ID:Qq88xGOU
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK


※前スレ
Excel VBA 質問スレ Part57
https://mevius.5ch.net/test/read.cgi/tech/1536583359/
2018/11/30(金) 09:06:54.20ID:cHj05URw
>>37
いや、Sendkeysは絶対使っちゃいかんものNo.1だろ。
制御出来ないからな。
わかってて一過性のプログラムで使う以外に使うことは無い。
2018/11/30(金) 11:07:00.94ID:yuW+a+er
>>38
ご忠告ありがとうございます。
2018/11/30(金) 12:03:29.38ID:LyLvfax5
>>35
MSDNライブラリでWorkbookオブジェクトのOpenメソッドの説明を詳しく読めば解決
2018/11/30(金) 18:19:35.02ID:RELaXAo9
>>40
マクロのパスワード解除ってワークブックオープン関係なくね。
2018/11/30(金) 18:57:50.86ID:cHj05URw
そもそもマクロパスワ―ドってことはVBEを弄ることになるから普通はセキュリティ設定に引っかかる。

VBAでVBEを弄れる設定になってるなら、参照設定でVisualBasic for Applications Extencibilityを追加して頑張ることになるわけだけどセキュリティ皆無となって危険だぞ。

それにそのコードがウィルス判定されるかも。
2018/11/30(金) 19:30:48.61ID:D2Lo7Qd2
>>41
この質問者が「解除」という言葉で言いたいのは、パスワードなしのファイルとしてファイルを再保存することじゃなくて、ただ単に読み取りパスワード付のファイルを普通に実行することだと思うぞ
Sendkeysとか恐ろしいことを上で言ってるので
2018/11/30(金) 23:26:49.39ID:1+TlpALp
>>43
プロジェクトエクスプローラーって言ってるのにそんなわけ無いだろ
4535
垢版 |
2018/12/01(土) 07:37:11.82ID:0dTVd6NK
>>43
マクロのロック解除です。

ワークブックと書いて混乱を招いてしまいました。
ファイルは開けます。

現状はマクロでVBAをアクティベートし、vbkeyで操作する方法で試してますが未だにうまく動かないです。
2018/12/01(土) 12:13:55.48ID:bMs1CWzL
>>45
VBAのsendkeyは不安定なので、vbsとかを経由しろとか聞いたことある気がする。ちょっと調べてみては?
4735
垢版 |
2018/12/01(土) 12:16:20.34ID:0dTVd6NK
>>46
ありがとうございます。
試してみます。
2018/12/01(土) 12:20:42.98ID:TS4bNkMJ
フォルダ内にある全てのtxtファイルをピボットテーブルで変換して一つのファイルに結合するにはどうしたら良いですか?
2018/12/01(土) 12:22:51.76ID:TS4bNkMJ
>>48
一つのテキストファイルあたりExcelの104万行を超えています
2018/12/01(土) 12:30:20.41ID:Yrektqt+
>>49
Accessに取り込んで104万件以下に整理してからExcelに読み込む
2018/12/01(土) 13:39:55.20ID:TS4bNkMJ
>>50
Accessで一括に読み込めますか?
2018/12/01(土) 17:27:15.14ID:qC6lat5H
>>47
vbsとか経由でも駄目だろ。
何が駄目かと言うと入力したい所にピンポイントで入力するわけじゃ無いところ。
直前に入力したい所にフォーカスを当てるとか工夫してる人もいるけど根本的によろしく無いんだよ。
動かしてる時に別の何かをクリックしたりするとそっちに入力されちまう。

改めて確認するけどVBAがパスワード保護されてコ―ド編集出来ない状態になっている。
パスワードは分かっていて手動で解除出来るけどブックが大量で解除と再設定が大変という問題?
2018/12/01(土) 17:45:25.58ID:qC6lat5H
>>51
そのテキストファイルはどんなファイル?
データベースのデータのようなものなの?
その104万行というのは、そもそも全部必要なの?

全部必要じゃない、特にもし必要なのはごく一部というのだったら、テキストファイルとして開いて1行ずつ読み込んで、必要あるデータのみ抜き出すという方法が良いと思う。

全部必要だったらAccessを使うべきデータ量だな。
でも、そのデータをどんな風に扱いたいか分からないから一概には言えない。
5435
垢版 |
2018/12/01(土) 17:56:01.08ID:0dTVd6NK
>>52
おっしゃる通りです。
マクロで大量に作ったマクロパスワードが同じファイルのパスワードを解除し、マクロを消すプログラムを作りたいです。
マクロを消すプログラムはマクロパスワード無しのファイルに関しては全てうまく動いています。
またエクセルファイルにはパスワードはかけていません。

過去に作ったエクセルファイルは残したままマクロを全て消せとの指令で必要となっています。
2018/12/01(土) 18:47:27.12ID:X1CAEXrd
xlsxで保存すればマクロは消えない?
2018/12/02(日) 12:24:29.74ID:RxJGbltM
そんな大量のデータ、一行ずつ読んでたら日が暮れるぞ。
バイナリモードで開いてメモリの許す半範囲で読んで、末尾の改行までを消すの繰り返して読み込んだ方が遥かに早いよ
2018/12/02(日) 13:35:42.09ID:QrHhUpeR
100万行越えのデータは、まず複数列、複数シートを使って読み込んでみれば?
内容によっては固まって何もできなくなる悪寒しかないけど
2018/12/02(日) 17:24:20.84ID:L8bj4c7S
100万行が大量か?
それはどんな100万行かによる。
100万個の改行だって100万行だ。
2018/12/02(日) 17:27:05.82ID:L8bj4c7S
>>54
>>55が書いてるようにxlsxで保存するようなのは駄目なのか?
60デフォルトの名無しさん
垢版 |
2018/12/02(日) 21:09:54.29ID:V0qE8100
ユーザーフォーム上のクリックボタンが、Tabで通過する分には何も起こらないのだけどカーソルキーで通過するとチェック入るのだけど、コード書いて制御するしかない?
2018/12/02(日) 22:14:16.48ID:KrKU+109
クリックボタンにチェックとは?
2018/12/03(月) 00:04:08.66ID:X8MytAwB
EXCELのVBA使いたいのですが
どうやったら起動できますか?
最初からEXCELにソフト入ってるんですか?
2018/12/03(月) 00:39:02.99ID:eKdLT8zi
Microsoft Visual Basic for Applications(VBA)エディターが開きます。

Alt+F11
64デフォルトの名無しさん
垢版 |
2018/12/03(月) 07:02:37.21ID:F098t6Ls
>>61
すみません、チェックボックスでした
2018/12/03(月) 19:46:40.74ID:zpf7CT60
>>55
>>59

xlsx保存し元ファイルを全て消すでやりたい事ができました。
ありがとうございます
2018/12/03(月) 23:49:02.49ID:Ks+qj00w
フランス政府からマクロン消したら市民が泣いて喜ぶよね
ありがとうございます
2018/12/04(火) 00:09:42.14ID:fkKXq52U
>>62
まずは首を括れよ
2018/12/04(火) 06:14:33.41ID:Jf/aCYja
>>62
消えろ小僧
2018/12/04(火) 09:00:31.20ID:F519qlgb
"ab","bc","c
d"
みたいなcsvがあり、これを処理速度重視で読み込みたいんですがなにかいい方法無いですかね
なんか配列操作で計算、集計して最後シート出力すると早いと思うので配列に入れたいんですが1行ずつの読み込みだとうまく行かずで困ってます
fsoで全文読んでも改行されてますし…
2018/12/04(火) 09:15:39.52ID:TjlcF2tR
>>69
めんどそう
そんなんじゃ " のエスケープとかも考慮しなきゃいけないんでしょ?

だけど気合い入れてアルゴリズムごりごり実装するのを勧める
2018/12/04(火) 09:18:52.95ID:FU2ewWox
>>69
ボトルネックがFile I/Oならバイナリで全部読んでコンマでsplit
ただし文字列変数の限界は2GBなのでファイルサイズに注意
2018/12/04(火) 12:54:59.46ID:HOLQGFa9
どうでも良いけど1レコードの定義をちゃんとしないと膨大なカラムの1レコードデータになっちまうぞ。

バイナリ読み込みでやるのは確かに早いんだが、そこを気にする程のデータ量なのかなあ。
この間の100万行デ―タもサンプル作って読み込んだら10秒とかだったぞ。
2018/12/04(火) 13:26:11.27ID:F519qlgb
全文読んだ後にレコード単位に分けてカンマ区切りで分けてーをしっかりアルゴリズム書くて感じですかね
そこそこ面倒臭いですねこれ
2018/12/04(火) 13:31:22.51ID:nDNFtNox
セルコピーでValudatonの中身までコピーする方法ってありますか?
愚直にコピーすると設定したプルダウン情報が消えてしまいます
2018/12/04(火) 17:53:21.87ID:eg0Zt3qJ
>>73
エスケープなし、カンマのみ項目なし、改行のみ項目なしなら楽なんだけどね
2018/12/04(火) 18:44:19.91ID:F519qlgb
>>73
自己レス
adodb使ったらなんかいい感じにいけました
2018/12/04(火) 23:45:07.95ID:foGY0MAA
外部のExcelマクロを呼び出し、その処理の中でMsgBoxが表示された場合、それを呼び出し元で認識する方法はありますか?
Msgboxを操作したいとかではなく、表示されたということがわかればいいです
2018/12/05(水) 01:51:39.17ID:bmTXilR5
>>77
APIでHWNDを列挙
2018/12/05(水) 08:11:01.31ID:j7wcFAGs
>>77
外部のExcelマクロというのが別プロセスのExcel上で動いてるマクロという意味なら方法はある。

内部でもExcelが落ちる可能性を承知するならある。
2018/12/05(水) 18:51:03.67ID:cxhucZsa
>>78,79
APIでの実現方法がよくわからなかったので、呼び出されるマクロに認識用のモジュールを追加することにしました
ありがとうございました
2018/12/05(水) 22:21:05.50ID:LTu8VXCT
>>76
自己レス
adodbも面倒臭かったacces無いんでcsvのデータ型判定の為にschma.iniみたいなの作る必要あったり…
元の文字コードとかbomとか考慮しないといけないけどworkbookのopen使ってマズかったらエラー出した方が早かったかも
2018/12/06(木) 08:13:12.56ID:5yG8Yqq9
>>81
いい肥やしになったと思います
2018/12/06(木) 23:32:22.39ID:O2YT1bAS
肥やしって具体的には何のこと?
2018/12/07(金) 08:39:50.57ID:a2+Odvtp
普通にOpenしてLine Inputした方が速くて簡単だったんじゃない?
と思ったら文字コード?BOM?

最初の質問は何だったのか。
文字コード考えなきゃならんのなら、
最初から選択が限られるだろ。
2018/12/07(金) 23:08:14.09ID:vEdbg58X
まあでもsplitはないよな
2018/12/07(金) 23:45:43.79ID:ny7N65D8
データ内の改行やカンマを正しく解釈するためにモジュール自作してる
2018/12/08(土) 08:49:31.99ID:D25PXYri
データ内のダブルクォーテーションもあるで
2018/12/08(土) 10:23:21.41ID:qbpmcynn
この手のことはだいたい同じ事を先に考えている人がいるから、
参考にするなりDLして利用するなりすれば、やりたいことは秒で完成させられる
理解するのはまた別で、ちゃんとソース読めな話になるけど。

たとえば、「VBA CSV BAS」でググって即出るヤツだとこんなとか。
ttps://github.com/sdkn104/VBA-CSV
2018/12/08(土) 11:33:49.23ID:KOgxZmAl
Range("C1:C10") = "=A1+B1"
とセルに式を埋め込むと自動で A2+B2、A3+B3 とやってくれますが
WorksheetFunctionで上と同じ事を1行で簡単に書くことってできますか?
うまい方法思いつかないのでいつも 関数埋め込み→値貼り付けで式を消す とやってます
WorksheetFunctionのループは式の埋め込みより遅かったです
2018/12/08(土) 15:59:33.39ID:/nD5g8zA
>>89
わざわざVBAを使って、最後に値貼り付けするぐらいなら、俺ならVBAで計算して結果だけ書き込む
For r = 1 To 10
  cells(r, 3) = cells(r, 1) + cells(r, 2)
Next

式がワークシート関数バリバリでVBAで再現するのが面倒なら、最後の値貼り付けをVBAで書く
set r = Range("C1:C10")
r.Copy
r.PasteSpecial Paste:=xlPasteValues
2018/12/08(土) 16:47:33.14ID:X2RnV3YS
俺ならVBAで各セルに計算式埋めるけどな
2018/12/08(土) 17:13:31.83ID:Zw8nZFqz
Range("C1:C10").Formula = "=A1+B1"
Range("C1:C10").Value=Range("C1:C10").Value
2018/12/08(土) 18:00:32.80ID:FvhEiENk
>>89
人に教えてもらう分際で、一行でとか注文つけてんじゃねーよ。
2018/12/08(土) 19:19:47.59ID:I01ncySI
ワークシートか配列へ代入したり配列をワークシートに直接貼り付けたりって技いつ頃から一般的になった?
なんか20年前からやってたという人がいて本当かよと思ったんだが。
2018/12/08(土) 20:28:45.94ID:/nD5g8zA
>>94
特定の個人が知ってたのと、一般的かどうかなんて全然関係ないじゃん
ExcelもVBAも20年以上前からあるんだし、知ってても不思議じゃない
2018/12/08(土) 20:53:05.77ID:dkUbxCqg
>>95
ああごめんなさい
「そんなの20年前から一般的だったよ」みたいなニュアンスで言われたんですよ。
自分としてはここ2〜3年で知られた新しめのテクニックだと思ってたんで、「マジか?」と。
2018/12/08(土) 21:00:40.14ID:/nD5g8zA
20年前のことは知らんけど、さすがにここ2〜3年てことはない
もっと昔から知られてた
2018/12/08(土) 21:04:04.90ID:Ac8D4eVv
>>97
ですね。

そもそもいちいちセル移動して操作なんて、トロくさくてやってられん。

Google Apps Scriptなんかでも配列で操作なんて、速度稼ぐ為に普通に使う枯れたテクニック。

あまりにもセル操作という初歩だけが広まった弊害だね。
2018/12/08(土) 21:07:43.53ID:KOgxZmAl
A いつも自分がやっているやり方
Range("C1:C10000") = "=A1+B1"
Range("C1:C10000").Copy
Range("C1:C10000").PasteSpecial Paste:=xlPasteValues

B 90案
For r = 1 To 10000
Cells(r, 3) = Cells(r, 1) + Cells(r, 2)
Next

C 92案
Range("C1:C10000").Formula = "=A1+B1"
Range("C1:C10000").Value = Range("C1:C10000").Value

D 配列 
計算元の配列= Range("A1:B10000")
For i = 1 To 10000
計算結果格納配列(i, 0) = 計算元の配列(i, 1) + 計算元の配列(i, 2)
Next i
Range("C1:C10000").Value = ans

E 半分配列
For r = 1 To 10000
計算結果格納配列(r, 0) = Cells(r, 1) + Cells(r, 2)
Next
Range("C1:C10000").Value = ans

A0.035
B0.265
C0.031
D0.015
E0.062
2018/12/08(土) 21:09:26.57ID:KOgxZmAl
時間(秒)
A 0.035
B 0.265
C 0.031
D 0.015
E 0.062

配列は頭がごちゃごちゃして苦手なんだけどやっぱ配列かなー
いつものは書くのが楽だけど見栄えがあんま良くない
Range("C1:C10000") = "=A1+B1"の部分を数式残さずWorksheetFunction一括で書けないかなーと思ってた
みなさんどうも
2018/12/08(土) 21:12:06.71ID:KOgxZmAl
書き間違い
ans→計算結果格納配列
2018/12/08(土) 22:34:44.30ID:Pds2yprW
Range("c1:c10") = Evaluate("=a1:a10+b1:b10")
2018/12/08(土) 23:08:03.54ID:KOgxZmAl
>>102
速くて簡潔
今までの中で一番早い
Evaluate知らないので勉強してみます。有難う。
104デフォルトの名無しさん
垢版 |
2018/12/08(土) 23:21:36.60ID:Q+l9Re6e
>>102
あーなんかいいのがあったはずだと思っていたがEvaluateかーー
くやしいから
Range("c1:c10") = [a1:a10+b1:b10]
105デフォルトの名無しさん
垢版 |
2018/12/09(日) 07:19:28.94ID:Pe0BknB8
データを蓄積、変更して管理するシステムをVBAで作るとして、普通、データとプログラムを分けるよな?
106デフォルトの名無しさん
垢版 |
2018/12/09(日) 08:55:53.41ID:BPsncq85
>>105
分けるけど、わざわざそういう質問するってことは現状データをBookに蓄積先してる状況なのかな?
入出力画面をExcel & VBAで作って、データはDBに蓄積するってのがこの場合の模範解答だと思うが。
2018/12/09(日) 21:01:53.98ID:F2zjByp1
>>94
配列数式ってのは大昔からあったな。エクセルはVBA書かないと標準機能ではクロス集計が
面倒くさいダメダメ君だった。「条件付き合計式ウィザード」なんていう冴えないシロモノに失望して
108デフォルトの名無しさん
垢版 |
2018/12/10(月) 12:24:50.65ID:F1/sCBz9
>>96
おまえが2〜3年前に知ったからってなんで勝手に一般化して皆そうだと思うんだよ
2018/12/11(火) 08:00:45.59ID:VzVuR/sH
みんな、落ち着いて聞いてくれ。
間も無く2019年だ。2019だぞ?
配列に突っ込んで一括処理するのは、少なくともEXCEL98から使われてきた手法だ。
既に20年経過してやがる。
2018/12/11(火) 08:30:34.19ID:jr4KaA92
>>109
٩(๑`^´๑)۶\(^-^ ) ヨシヨシ
2018/12/11(火) 08:41:05.40ID:mN+cBX2v
空白行が複数ある範囲から、空白行を除いて配列に取り込むのはどうやるのが効率がいい?
条件
・行内は完全に空白かそうでないかで中途半端にデータが入ってるところはなし
・空白行を除いたデータ総数は300前後で最大で16程度に分割されている
・空白行は連続することもある

一行一行調べるより、データの塊の上下の行番号を調べるのが正解な気がするんだけど
2018/12/11(火) 08:55:39.61ID:OAAPkOpt
>>111
そのデータがワークシート上にあるんなら、オートフィルターかければ?
VBAで1行で書けるぞ
2018/12/11(火) 09:27:01.56ID:zUaOIyWC
>>111
> データの塊の上下の行番号を調べる
それ一行一行調べないとわからないんじゃね?

普通に一気に配列に読み込んで空白行を詰める処理を入れればいいかと

>>112
フィルタ掛けた結果を一気に配列に読み込むってできたっけ?
2018/12/11(火) 11:43:07.63ID:U/EFAptV
>>109
fjだかのExcel会議室では配列がホットな話題になったよ
t.Tanaka氏とかもコテハンで議論に参加してさ
なつかしいなあ
2018/12/11(火) 11:50:12.79ID:s7r8QuRW
>>114



2018/12/11(火) 12:15:58.68ID:/u4ZG0F2
>>115
当時からおっさんだったら、今頃じーさんかも知れないぞ。
2018/12/11(火) 14:13:54.04ID:mN+cBX2v
>>113
下からCtrl↑で止まったセルの行番号を取得するを繰り返せば毎行調べなくて済む

オートフィルターで絞った結果を可視セルだけ選択しても、取り込まれるのは左上だけになるから無理だね
一行一行調べる羽目になる
やるなら作業シート作ってコピペしてから取り込むんだけだ、それはやりたくない訳で
2018/12/11(火) 14:39:45.96ID:zUaOIyWC
>>117
> 下からCtrl↑で止まったセルの行番号を取得するを繰り返せば毎行調べなくて済む
それはそうだけど速いかどうかは状況次第だね
>>112 > VBAで1行で書けるぞ
って方法があるみたいなことを書いてるので聞いただけ
2018/12/11(火) 20:47:54.18ID:r2my7w49
>>118
元々、どういう考えで>>112が言ったのかは分からんけど、配列に取り込むまでを1行って言ってたのかなあ。
オートフィルタをかけるコードが1行という意味じゃないかな。

だからといって、そこからどうするんだ?とは思うけどさ。
2018/12/11(火) 21:00:32.57ID:zUaOIyWC
>>119
元々は
>>111
> 空白行が複数ある範囲から、空白行を除いて配列に取り込むのはどうやるのが効率がいい?
なので、フィルターだけの事を言われても…
2018/12/11(火) 21:34:59.21ID:OAAPkOpt
クリップボード経由でデータを一気に取得、オートフィルタにも対応
※最小設定FM20.DLLが必要
Sub Macro1()
  ActiveSheet.Range("A1:C10").Copy
  With New MSForms.DataObject
    .GetFromClipboard
    str = .GetText
  End With
  MsgBox str
End Sub
2018/12/11(火) 21:35:27.33ID:OAAPkOpt
参照設定
2018/12/11(火) 21:40:19.21ID:r2my7w49
>>120
そりゃそうだけど、>>112を読む限り1行ってのはオートフィルタだけについて言ってるように受け取る方が自然じゃん。
だから、そこからどうするんだという感想になるわけ。
そもそも>>112は配列に取り込むことなんて想定してないかもしれない。
空白があって見にくいのを何とかしたいんだろうとか、勝手に先読みして配列に取り込むという元のお題をほったらかしとか。

そもそも300行程度のデータならどんな方法でも良いんじゃないかと思う。
そんなんで思い悩むのは無駄だよ。
2018/12/11(火) 21:51:43.64ID:zUaOIyWC
>>123
ガイジなのかな?
2018/12/11(火) 22:40:05.46ID:r2my7w49
>>124
君が?
それとも>>112?
2018/12/11(火) 22:53:52.01ID:8DZhL+mg
それこそVariant型配列にでもぶっ込めば手っ取り早いし処理もそれなりに速そう
2018/12/11(火) 23:25:52.21ID:mBAHWwo2
UI Automationのレイトバインドって、どうやればいいんでしょう?
レジストリ調べてもクラスID出てこないし・・。
2018/12/11(火) 23:34:38.12ID:r2my7w49
>>127
基本的に出来ない。
2018/12/12(水) 00:19:46.28ID:3KU1fzXl
>>128
参照設定は出来るのに、CreateObjectは不可なんてのがあるんですか?
2018/12/12(水) 06:08:42.05ID:yHW8d60g
>>125
自覚がないのは可哀想
2018/12/12(水) 09:43:38.09ID:F+70e5KM
>>129
ある。
2018/12/12(水) 09:44:36.67ID:F+70e5KM
>>130
まず、日本語の勉強をしような。
2018/12/12(水) 12:29:40.76ID:4PEjGm8G
>>132
どこから日本語とか出てくるんだろう?
日本語ができないという自覚はあるってことなのか? w
2018/12/12(水) 19:01:00.09ID:pifCGzoS
グラフ作成マクロ作ったんだけど結構面倒くさくない?慣れの問題?
特に細かなフォーマットとか云々がめんどい
それに出力シートのセルいじられて(1行目削除)出力セルがズレたせいでフォーマット崩れたとか言われて頭痛いんだけどどう対処するのが良いのこれ
135デフォルトの名無しさん
垢版 |
2018/12/12(水) 20:01:12.49ID:K6Ng+wlm
使用方法まとめたドキュメント作ってないなら作成者が悪い。
作ってるなら碌に読まないで文句いってる使用者が悪い。
作り方次第で解決するとは思うが。
2018/12/12(水) 20:02:06.59ID:aZC5ZPlw
ルーチンにはルールが必要やで
2018/12/12(水) 22:32:28.50ID:3KU1fzXl
>>134
逃げる。
いや、マジで。
フォーマットを壊す人ような人の依頼を受けると碌なことない。
どうしてもやらなきゃダメなら、
ちょっとでも崩れたら、エラーメッセージが出るようにする。
あなた壊しましたね。直さないと出力できませんよ的な。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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