Excel VBA 質問スレ Part58
■ このスレッドは過去ログ倉庫に格納されています
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part57
https://mevius.5ch.net/test/read.cgi/tech/1536583359/ Dim Otimpo As Variant
Set Otimpo = New Penis
Otimpo.Insert Woman.Vagina >>1
=LEFT("おつかれあかたあまや",4) ややExcelと離れるのですが、他に適切な場所が見当たらないのでこちらで質問。
WordやPowerpointに、埋め込み、またはリンクで表示されているExcelの表やグラフについて、
1:ファイル名(フルパス、ないし相対パス)
2:表示されているシート名(またはシート番号)
3:表示されている表の範囲(A1からB20まで、みたいな)
を、WordやPowerpointで動かすVBAから列挙する、みたいなのを作りたいと考えてます。
(1)についてはある程度(たまに取れないのがある)なんとかなるのですが、
(2)と(3)の手段が分からないでいます。
この辺を得る手段について、ご存じの方いましたら教えてください。 表示されているシート名 って要は現在アクティブなシートってことでしょ?
ActiveSheet.Nameで取れるんじゃ? >>8
やったことがないから保証できないが、
OLEObject.ObjectプロパティからOLEオブジェクトのコントロールを取得できるはず
ここからExcelのオブジェクトモデル経由でシート名等は取れるかも >>9,10
そういえば、シート名はそれで取れますね。うっかりしてました。
ただ、Powerpointで表示されている、シート上の範囲( >>8 の(3) )がマジわからん。
ActiveSheetまでは到達出来るので、シート全体のデータは取れるのだけども、
表示範囲となるとどこを見れば良いのやら…… 表示範囲っての意味がよく判らない。使用されている範囲ならUsedRangeプロパティだけどそうじゃない? QueryTables.addを利用して取り込んだテキストデータを
TextFileFixedColumnWidths = array(5,4,2)
とVBソースに記述して5、4、2バイト目で区切ってエクセルに貼り付けしているのですが、
このarrayのカッコ内の値5,4,2の部分を1つのセル内に定義しておき、そこから取得して処理する方法を教えてください。(セル値を変えるだけで区切りバイトを変えられるようにしたいです)
セル内の定義は下記のような感じの形式で実現できたらいいなと思っています。
5,4,2
または
"5","4","2"
など
よろしくお願いします。 >>12
UsedRangeは、まさに「Excel上で利用されている範囲」になるので、ちょっと違う。
探しているのは、(WordとかPowerpointとか) 「被貼付側から見えている範囲」。
コピペを行うときにExcel上で範囲指定してる、まさにその範囲の情報が欲しいのです。
『広い範囲が使われているシート(埋め込みオブジェクト)の一部分だけが表示されている時、
その表示部分を特定する』がやりたいの。 >>13
3つパラメータがあるならそもそも3つのセルで管理すればいいんじゃないかと思うが、区切る回数も動的にしたいのかな?
パラメーター記述用のセルに5,4,2と入力しておいて、コード内でSplit関数を使いそのセルの値をカンマ区切りで配列化するのが普通かな
そうやって得たString配列の要素全てをCIntで型変換してInteger配列に入れ直せば、TextFileFixedColumnWidthsプロパティに代入できる >>15
区切る回数も動的にしたいんです。
さっそく試してみます。ありがとうございます。 >>15
無事にやりたいことが実現できました。ありがとうございました。勉強になりました。 ユーザーフォームのボタンでExcel以外のファイルを開くのにShell.Execute使ったんだけど、ボタンを押しても何も反応しない
CreateObject("Shell.Application").ShellExecute "c:\test\test.pdf" >>18
試してみたけど、そのコードで問題なく動くなあ >>18
デザインモードがオンになってるとかじゃね 検証ありがとう!
ちな標準モジュールに書くと普通に動く。
どうもユーザーフォームに書くとダメみたい >>21
違った
ユーザーフォームじゃなくてユーザーフォーム内のボタンね ユーザーフォーム作ってボタン配置してボタンのOnClickにコード書いたけど問題ない みんなマジか〜
環境は2010、2007ともにダメだった。
明日2016で試してみる。
ちなみにパスがフォルダ指定までなら動く。
もう意味わからん >>24
もしかしてpdfをダブルクリックした時に「このファイルを開くアプリ」の選択メニューが出てない? >>25
すまぬすまぬ。実は開かないのは.xlsxや.xls。
さっきやったら.txtや.bmpに書き換えるとちゃんと動いた。関連付けがおかしいかと思ったけどファイルダブルクリックでexcelファイルは開く。 >>27
やっぱりそうですよね、、
ありがとうこざいました! >>26
VISTA32ビットのEXCEL2007で再現した
ちなみにブレークポイントはってステップインさせたらちゃんと動いた 切り取り・コピーしようとしたら「クリップボードを開くことが」と表示されました 前までは正常に出来てたのに急にあんなになるなんて
どうしたらなおるんですか
原因不明の謎の症状 >>30のところ、再起動したら直りました
自己解決 WorksheetFunctionを使うと遅くなると聞きました。セルで計算して取得したほうがいいですか? >>32
遅いと言っても、よほど大量のデータを処理しない限り大差ないから気にしなくていい workbook.Aのマクロから、workbook.Bのマクロパスワードを解除できますか?
*パスワードは分かっています
**windows10 / excel 2016
同じパスワードをかけた大量のファイルのマクロパスワード解除が必要になった為 >>36
ありがとうございます。
VBAでsendkeyでパスワード入れたいのですが、プロジェクトエクスプローラーのウィンドウで、目的のworkbook.Bを選択してパスワードウィンドウを開く事がうまくできないところです。 >>37
いや、Sendkeysは絶対使っちゃいかんものNo.1だろ。
制御出来ないからな。
わかってて一過性のプログラムで使う以外に使うことは無い。 >>35
MSDNライブラリでWorkbookオブジェクトのOpenメソッドの説明を詳しく読めば解決 >>40
マクロのパスワード解除ってワークブックオープン関係なくね。 そもそもマクロパスワ―ドってことはVBEを弄ることになるから普通はセキュリティ設定に引っかかる。
VBAでVBEを弄れる設定になってるなら、参照設定でVisualBasic for Applications Extencibilityを追加して頑張ることになるわけだけどセキュリティ皆無となって危険だぞ。
それにそのコードがウィルス判定されるかも。 >>41
この質問者が「解除」という言葉で言いたいのは、パスワードなしのファイルとしてファイルを再保存することじゃなくて、ただ単に読み取りパスワード付のファイルを普通に実行することだと思うぞ
Sendkeysとか恐ろしいことを上で言ってるので >>43
プロジェクトエクスプローラーって言ってるのにそんなわけ無いだろ >>43
マクロのロック解除です。
ワークブックと書いて混乱を招いてしまいました。
ファイルは開けます。
現状はマクロでVBAをアクティベートし、vbkeyで操作する方法で試してますが未だにうまく動かないです。 >>45
VBAのsendkeyは不安定なので、vbsとかを経由しろとか聞いたことある気がする。ちょっと調べてみては? フォルダ内にある全てのtxtファイルをピボットテーブルで変換して一つのファイルに結合するにはどうしたら良いですか? >>48
一つのテキストファイルあたりExcelの104万行を超えています >>49
Accessに取り込んで104万件以下に整理してからExcelに読み込む >>47
vbsとか経由でも駄目だろ。
何が駄目かと言うと入力したい所にピンポイントで入力するわけじゃ無いところ。
直前に入力したい所にフォーカスを当てるとか工夫してる人もいるけど根本的によろしく無いんだよ。
動かしてる時に別の何かをクリックしたりするとそっちに入力されちまう。
改めて確認するけどVBAがパスワード保護されてコ―ド編集出来ない状態になっている。
パスワードは分かっていて手動で解除出来るけどブックが大量で解除と再設定が大変という問題? >>51
そのテキストファイルはどんなファイル?
データベースのデータのようなものなの?
その104万行というのは、そもそも全部必要なの?
全部必要じゃない、特にもし必要なのはごく一部というのだったら、テキストファイルとして開いて1行ずつ読み込んで、必要あるデータのみ抜き出すという方法が良いと思う。
全部必要だったらAccessを使うべきデータ量だな。
でも、そのデータをどんな風に扱いたいか分からないから一概には言えない。 >>52
おっしゃる通りです。
マクロで大量に作ったマクロパスワードが同じファイルのパスワードを解除し、マクロを消すプログラムを作りたいです。
マクロを消すプログラムはマクロパスワード無しのファイルに関しては全てうまく動いています。
またエクセルファイルにはパスワードはかけていません。
過去に作ったエクセルファイルは残したままマクロを全て消せとの指令で必要となっています。 そんな大量のデータ、一行ずつ読んでたら日が暮れるぞ。
バイナリモードで開いてメモリの許す半範囲で読んで、末尾の改行までを消すの繰り返して読み込んだ方が遥かに早いよ 100万行越えのデータは、まず複数列、複数シートを使って読み込んでみれば?
内容によっては固まって何もできなくなる悪寒しかないけど 100万行が大量か?
それはどんな100万行かによる。
100万個の改行だって100万行だ。 >>54
>>55が書いてるようにxlsxで保存するようなのは駄目なのか? ユーザーフォーム上のクリックボタンが、Tabで通過する分には何も起こらないのだけどカーソルキーで通過するとチェック入るのだけど、コード書いて制御するしかない? EXCELのVBA使いたいのですが
どうやったら起動できますか?
最初からEXCELにソフト入ってるんですか? Microsoft Visual Basic for Applications(VBA)エディターが開きます。
Alt+F11 >>55
>>59
xlsx保存し元ファイルを全て消すでやりたい事ができました。
ありがとうございます フランス政府からマクロン消したら市民が泣いて喜ぶよね
ありがとうございます "ab","bc","c
d"
みたいなcsvがあり、これを処理速度重視で読み込みたいんですがなにかいい方法無いですかね
なんか配列操作で計算、集計して最後シート出力すると早いと思うので配列に入れたいんですが1行ずつの読み込みだとうまく行かずで困ってます
fsoで全文読んでも改行されてますし… >>69
めんどそう
そんなんじゃ " のエスケープとかも考慮しなきゃいけないんでしょ?
だけど気合い入れてアルゴリズムごりごり実装するのを勧める >>69
ボトルネックがFile I/Oならバイナリで全部読んでコンマでsplit
ただし文字列変数の限界は2GBなのでファイルサイズに注意 どうでも良いけど1レコードの定義をちゃんとしないと膨大なカラムの1レコードデータになっちまうぞ。
バイナリ読み込みでやるのは確かに早いんだが、そこを気にする程のデータ量なのかなあ。
この間の100万行デ―タもサンプル作って読み込んだら10秒とかだったぞ。 全文読んだ後にレコード単位に分けてカンマ区切りで分けてーをしっかりアルゴリズム書くて感じですかね
そこそこ面倒臭いですねこれ セルコピーでValudatonの中身までコピーする方法ってありますか?
愚直にコピーすると設定したプルダウン情報が消えてしまいます >>73
エスケープなし、カンマのみ項目なし、改行のみ項目なしなら楽なんだけどね >>73
自己レス
adodb使ったらなんかいい感じにいけました 外部のExcelマクロを呼び出し、その処理の中でMsgBoxが表示された場合、それを呼び出し元で認識する方法はありますか?
Msgboxを操作したいとかではなく、表示されたということがわかればいいです >>77
外部のExcelマクロというのが別プロセスのExcel上で動いてるマクロという意味なら方法はある。
内部でもExcelが落ちる可能性を承知するならある。 >>78,79
APIでの実現方法がよくわからなかったので、呼び出されるマクロに認識用のモジュールを追加することにしました
ありがとうございました >>76
自己レス
adodbも面倒臭かったacces無いんでcsvのデータ型判定の為にschma.iniみたいなの作る必要あったり…
元の文字コードとかbomとか考慮しないといけないけどworkbookのopen使ってマズかったらエラー出した方が早かったかも 普通にOpenしてLine Inputした方が速くて簡単だったんじゃない?
と思ったら文字コード?BOM?
最初の質問は何だったのか。
文字コード考えなきゃならんのなら、
最初から選択が限られるだろ。 データ内の改行やカンマを正しく解釈するためにモジュール自作してる この手のことはだいたい同じ事を先に考えている人がいるから、
参考にするなりDLして利用するなりすれば、やりたいことは秒で完成させられる
理解するのはまた別で、ちゃんとソース読めな話になるけど。
たとえば、「VBA CSV BAS」でググって即出るヤツだとこんなとか。
ttps://github.com/sdkn104/VBA-CSV Range("C1:C10") = "=A1+B1"
とセルに式を埋め込むと自動で A2+B2、A3+B3 とやってくれますが
WorksheetFunctionで上と同じ事を1行で簡単に書くことってできますか?
うまい方法思いつかないのでいつも 関数埋め込み→値貼り付けで式を消す とやってます
WorksheetFunctionのループは式の埋め込みより遅かったです >>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 Range("C1:C10").Formula = "=A1+B1"
Range("C1:C10").Value=Range("C1:C10").Value >>89
人に教えてもらう分際で、一行でとか注文つけてんじゃねーよ。 ワークシートか配列へ代入したり配列をワークシートに直接貼り付けたりって技いつ頃から一般的になった?
なんか20年前からやってたという人がいて本当かよと思ったんだが。 >>94
特定の個人が知ってたのと、一般的かどうかなんて全然関係ないじゃん
ExcelもVBAも20年以上前からあるんだし、知ってても不思議じゃない >>95
ああごめんなさい
「そんなの20年前から一般的だったよ」みたいなニュアンスで言われたんですよ。
自分としてはここ2〜3年で知られた新しめのテクニックだと思ってたんで、「マジか?」と。 20年前のことは知らんけど、さすがにここ2〜3年てことはない
もっと昔から知られてた >>97
ですね。
そもそもいちいちセル移動して操作なんて、トロくさくてやってられん。
Google Apps Scriptなんかでも配列で操作なんて、速度稼ぐ為に普通に使う枯れたテクニック。
あまりにもセル操作という初歩だけが広まった弊害だね。 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 時間(秒)
A 0.035
B 0.265
C 0.031
D 0.015
E 0.062
配列は頭がごちゃごちゃして苦手なんだけどやっぱ配列かなー
いつものは書くのが楽だけど見栄えがあんま良くない
Range("C1:C10000") = "=A1+B1"の部分を数式残さずWorksheetFunction一括で書けないかなーと思ってた
みなさんどうも ■ このスレッドは過去ログ倉庫に格納されています