Excel VBA 質問スレ Part50 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512
スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/
※前スレ
Excel VBA 質問スレ Part49©2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1498410914/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured >>686
固定なら画像はって上にラベルでええやん APIでフォームに線を書くまで行けました。
フォームに形状入力してFINDで検索して該当した行を右に空になるまで線を書き続けるコードにしました。
最初の一桁の数字は方向。4が左、6
が右という風に指示してます。
開始原点指定して、
線をLINETOで書いてて書いたらその近くにテキストボックスをADDで追加したいんですが、LINETOで指定した原点位置とテキストボックスのトップ、レフトで指定した位置がちょっとズレるのはなんかあるんですか?
https://i.imgur.com/FVhURv8.jpg 秒単位で記録されてる1日分で数万件の動作ログから、時系列かつ動作種類別の棒グラフ的な物を作りたいんだけど、、、
仮に横棒にするとして一時間単位に別ても3600セルも必要になるわけだけど、こういうのってどうするのが良いの? 横棒グラフ的 じゃなくて横棒グラフそのものを作りゃいい
何故セルをグラフとして使うのかの理由が判らんと何ともいえないが
毎秒すべてのデータが必ず必要とも思えんが、間隔変えれば概略にできるし
特異点を知りたい とかなら数値を基準に求めるものだろうし、その部分の
前後をピックアップして表示するようにして なるべく判りやすいものに
するのがグラフ化の目的なんでは データ吐き出して普通にグラフ作ればいいんじゃないの
何に悩んでるのかよくわからん >>688
試して無いから何とも言えんが、クライアント領域関連か、座標系の違いかな。
GetClientRectとかTwipsPerPixelでググってみる。違ったらごめん。
>>689
説明が分かりにくい。
3600のセルにデータが取れてるならそれを指定すれば良いということになる。
多分、3600セルという多量のデータだから適当な所で折り返してて1時間の00:00秒から59:59秒の流れを持ったまとまりとして認識させることが出来ないとかかな。
良く分からんが各秒の値でプロットする訳じゃ無いわけだし、平均とか取るもんじゃないの? ビットコインの公開APIから値段を取る方法ってありませんかね
パワークエリ使ってたんですがプロトコル障害で使えなくなってしまい.... フォルダ内にあるファイルのすべてを対象に、
ファイル名の最後を「_ou.mp4」に変更するマクロを作ってください。お願いします。
例)〇〇.mp4 → 〇〇_ou.mp4 【追加】
ただし、すでに「_ou.mp4」に変更されたファイルは、何もしないこと。
悪い例) 〇〇_ou.mp4 → 〇〇_ou_ou.mp4 こうならないように。 >>697
公開APIのプロトコル障害なら公開APIでは取れないって事じゃないの? ls | Where-Object { $_ -like "*.mp4" -and $_ -notlike "*_ou.mp4" } | Rename-Item -WhatIf -NewName { $_ -replace '\.mp4$','_ou.mp4' }
PowerShell で書いたので、そのフォルダへ移動してから実行して。
-WhatIf が付いているので、本当には実行せずに、結果だけを見れる。
本当に実行する際は、-WhatIf を削除して実行して
-like は一致するもので、-notlike は一致しないもの。
正規表現の \.mp4$ で、. に \ を付けているのは、
. の特殊な意味をなくして、普通の文字として扱うため(エスケープ)
x.mp4 → x_ou.mp4
ただし、x.mp4, x_ou.mp4 が、同じフォルダ内にある場合は、
変換できずにエラーになるかも >>704
正規表現使えるんだからWhere-Objectいらんでしょ >>705
他の言語でもっと短く書けるぜ
ってか? >>699
filesystemobjectのインスタンス取得
フォルダ取得
フォルダ内のファイルを精査
mp4のみ抽出
拡張子取得
拡張子を除いて指定の文字列を追加した文字列を取得
ファイル名変更
これでわかれ dir関数とNameステートメントでループが一番簡単じゃね?
サブフォルダ考えなくて良いんだしさ。 explorerのアドレス欄にcmd入れて
ren *.mp4 *_ou.mp4
とかじゃなかったっけ 制約があったか じゃ3行で
ren *_ou.mp4 *._oump4
ren *.mp4 *_ou.mp4
ren *._oump4 *_ou.mp4 質問失礼します
あるフォルダ内に数千件のファイルが格納されていて、そのフォルダに新規ファイルが入ってきたときにそのファイルを抽出(ファイル名を取得)したいのですが一番高速に処理を行うにはどうしたらいいでしょうか >>712
「新規ファイルが入ってきた時」という条件がハッキリしないけど、
いずれにせよ最終的に全て取得して比較する方法しかないと思う。 >>712
高速がどうとかよりまず新規にファイルが入ってきたことをどう検知するつもりなんだ >>716
えっ、あるの?
IntersectやUnion使って自作してたわ >>712
基準となる時点のファイル名一覧をシートに記録しておく
比較時点のファイル名一覧を別のシートに記録する
vlookupとかで同じファイル名があるか調べる >>712
業務で行き詰ったらまず上司に相談したら? >>712
フォルダをモニタリングするツールが色々とあるからそれ使うといいよ
たいていファイルシステムイベントで処理してるから
自分で比較するのに比べれば数桁高速だと思う >>720
それよく分からないから教えて。
例えば
Set minuend = Union(Range("C3", "D5"), Range("D4", "E6"))
Set subtrahend = Range("A2", "A4").EntireRow
Set expected = Union(Range("C5", "D5"), Range("D5", "E6"))
の場合に
minuend - subtrahend = expected になるようにしたいんだけど >>726
またまたソフトのインストールが制限されて〜なんて言い出す悪寒 勝手にインストールできないなら許可貰えば済む話なのにな
業務上必要なら許可降りるだろ 「前の担当者は手作業でこなしていました。あなたにもできるでしょ?電卓は許可します」 それ作って給料もらっているんだったら自力でやれば? それ作って給料もらってる人がこの板にいるわけない。
せいぜいマ板がいいところ。 >>712
ロバストコピーでフォルダのコピー
その際に何を新たにコピーしたのかをログに書き出すオプションを設定しておく
そのログを読みこんで後はお好きに処理
勝手に上書きされたり、勝手に消されてもバックアップ取れてて一石二鳥 >>733
要件次第だけどrobocopyでも十分かもね
フォルダ監視オプション使えば細かいタイミングもコントロールできるし vbaでやるよりはタスク組んでバッチ的に処理する案件の予感 日記
今まで動いてたマクロがエラーで止まった
テキストファイルの内容を調べてリネームするだけの簡単な物なのに、調べたらファイル名にユニコードが入ってた
10年ぐらい前に作った物なので、今さら対応するのめんどくさいなあ。これも時代か
どうせ台風でヒマだからちょっとやってみるか フォルダに複数のシートが入っていて、それぞれ○○.xls(○は名字)のファイルがあって、それの○○(○は名字)のシートのみを繰り返し検索、抽出を繰り返すにはどうしたらいいですか?
指定シートのみ繰り返し検索の仕方をご教授お願いします。
file = Dir(path & "*.xls")
Do While file <> ""
Set book = Workbooks.Open(path & file)
For Each sheet In book.Worksheets
Set f = sheet.Cells.Find(kwd,LookIn:=xlValues, lookat:=xlWhole)
If Not f Is Nothing Then
firstAddress = f.Address
rowtar=f.row
列の転記開始。 自分で勝手に名前を定義すんのやめれ。
それはシートじゃなくブックだろ
file = Dir(path & "○○(○*.xls")
で○○(○が先頭にあるファイル(この場合はブック)が取り出せるだろ?
ワイルドカードの意味判ってる? 確かにブックのことをシートと呼ぶ人は結構いるイメージ >>741
シート名が判っているなら
for each で探さなくても
set ws = Thisworkbook.worksheets(シート名)
でいい >>712
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200602/06020015.txt
他にもReadDirectoryChangesWを使った外人のサンプルは動いた。
けど、スレッド作ってるから危険なコードだね。
分かってる人が使う分には良いのかも知れないけどスレッド作らない方法を模索した方が良いんじゃないかなあ。 >>712
dirの結果をリダイレクトしてファイルに書き出し
またdirして前回の結果とfcする
繰り返し そのフォルダを、watch・見張る事は、できないのか?
そのフォルダに変化が起きたら、知らせる機能 >>747
個人のPCならフリーソフトでも探した方が早いと思う >>741
なんか要件とソースが違くない?
Findとかkwdは何してるの? >>748
早いか遅いかじゃなくて、VBAでやる方法が知りたいんだろ >>747
タスクスケジューラで定期的に調べるコードを動かす >>712は条件が不明すぎる上、質問者はいなくなってしまった
これ以上続けてもしょうがない アンケート入力してもらった内容を別シートのA1セルから下に書き込んでいく仕様です。そして、それが共有ファイルだとします。
共有の場合、同時にA1セルに書き込む可能性があります。
既に書き込みされていた場合、一つ下のセルに書き込むようにしてエラーを回避したいです。
どうしたら良いでしょうか >>754
共有をやめる
vbaでやれるなら共有にする意味を全く感じない VBAのオートフィルタの構文について
構文例以下のコードになっているのですが、課題としては文字列の抽出で
オートフィルターを使用して、「商品名」が「パソコン(ノート)」のデータを抽出するコードを記述しなさい。
となっているのですが記述方法がわかりません。
教えてください。
C3からが商品名のオートフィルタになっています。
Dim TargetCompany As String
Dim StartDay AS Date
Dim EndDay AS Date
TargetCompany = "○○株式会社"
Starday = #10/1/2014#
Endday = #10/31/2014#
With ThisWorkbook.Worksheets("受注データ")
.Range("B9").AutoFilter Field:=1,Criterial:">=" & Clng(StartDay)_
,Operator:=xlAnd,Criteria2:="<=" & Lng(EndDay)
.Range("B9".)AutoFilter Field:=2, Criteria1:=TargetCompany
End With >>754
データを格納するファイルと
そのデータを管理するファイルに分ける
データを管理するファイルでVBAを動かし
データを更新するときは更新中か否か判別する値を持つ
DBとDBMSのような関係 >>756
マクロの記録でオートフィルタの記録をとって見比べる >>752
>>718
VBA でやるにはハードル高いかも >>760
C♯とかだとイベント検知できたような気がするけど c#とか使わなくてもvbsでフォルダ監視するファイル作って実行させとけばいけるんじゃない?
c#かvb.net使っていいならFileSystemWatcher使えば希望通りのことが出来ると思います。 >>762
できるかできないか、じゃなくて、
やり方を具体的に頼む >>741
いや、だから既にVBAでも出来てるし。
ハードル高いかどうかは組む人のスキル次第でしょ。 >>763
今までのやり取りである程度推測できないならスキルが足りてないだけでしょ フォルダをウォッチする機能を
Excelに持たせようとすること自体がセンス悪い Book1 Sheetあ Sheetい Sheetう Sheetえ
Book1 の Sheetう の中にボタンを作って、そのボタンを押すとエクセルの任意のブックを参照して
参照したブックのSheet1の内容をすべてコピーして、Book1の Sheetあ のA1を起点に張り付けたいです。
ご教授お願いします 永久ループに適当にスリープ咬ませて、シートに列挙したファイル名と付き合わせるくらいかな?
高速かどうかはわからないけど >>767
任意のブックとは常に決まったブックなのか、
それともその都度変わるのか?
変わる場合は、どうやって指定するのか。 >>769
その都度変わります。
ですのでファイルを参照するウィンドウを開いて指定する方法ができると嬉しいです それ自体は難しくないと思います。
あとは、コピー元のブックがあるフォルダが決まってるかとかで多少変わってくるかと。
例えば常にカレントフォルダにあるとか、コピー先のブックと同じとか。 >>761
そりゃC#使えるならSystem.IO.FileSystemWatcherクラスを使えばいい
でもここはVBAスレだし
https://msdn.microsoft.com/ja-jp/library/system.io.filesystemwatcher(v=vs.110).aspx >>763
vbs
myFLD1 = "C:\監視フォルダ"
myFLD2 = "C:\コピー先"
myLimit = 3 '3分間監視する
Msgbox "監視スタート"
myTime = DateAdd("n", myLimit, Now)
myMEM = ""
With CreateObject("Scripting.FileSystemObject")
For Each myF In .GetFolder(myFLD1).Files
If InStr(1, myMEM, myF.Name & vbTab) = 0 Then
myMEM = myMEM & myF.Name & vbTab
End If
Next
Do
For Each myF In .GetFolder(myFLD1).Files
If InStr(1, myMEM, myF.Name & vbTab) = 0 Then
myMEM = myMEM & myF.Name & vbTab
.CopyFile myF.Path, myFLD2 & "\"
End If
Next
WScript.Sleep 500
If myTime < Now Then Exit Do
Loop
End With
Msgbox "END" >>763
vbsのサンプルなんでコピー処理を自分のやりたい処理に変えてみて下さい。
c#かvbなら上の人がリンク貼ってある先みるといいですよ タスクランナーのGulp, Grunt, Jenkins とかを使えば?
毎秒フォルダ・ファイルを、watch して、タスクを実行する。
タスクでエラーが起きると、watchを解除する
タスクランナー → アプリ
自分でプログラミングすると、逆になる。
アプリ → タスク
エラー処理も、難しい 盛り上がってるんだから、話題に入れないお前が諦めりゃいいんだよ >>772
VBAじゃ実用的なものは無理でしょって言う遠回しなお断りなんだが
まだvbsの方が現実的 VBAのステータスバーの表示方法について
課題でステータスバーを表示しなさいとなっているのですが割り算の問題?
なのかうまくひょうじできません。
基本は
Application.StatusBar = String(i, "■") & String(10- i, "□")
上記のコードでいいと思うのですが、
ステータスバーに進捗を表す"■"を表示する。表示する"■"の数は変数iの値を100で割った値とする
この、"■"の数は変数iの値を100で割った値とするの部分がうまくいきません。
やってみたのは下記のコードです
Application.StatusBar = String(Int(i / 100), "■") & String(Int(i / 100), "□")
ちなみに、Forの繰り返しは1から500です。 ちょっとお知恵を拝借したいと
Excel 2010で作業をしているのですが、
大量にあるシートにある非表示セルをとある事情で全て削除したいのです。
ただし、
・どの行・列が非表示になっているかはシート毎に異なる(むしろ、消したい行・列を非表示にして、マクロで消すことが考えられる)
・場合によってはSpecialcells(xlCellTypeLastCell)で拾えるセルより下/右の行/列が非表示になっている可能性がある
(使用されているセルはAD250までだが、非表示セルがAF列や300行に設定されていると上手くいかない。
または、AA:ADが非表示だとZ列が拾われてしまう。)
・どれくらい下/右まで使用されているかは必ずしも分からない(さすがに、1000行は使わないと思うが、断言できない)
という問題があります。
数十から百程度のシートがあるので、10000行500列のような数を処理するのは時間がかかるため、
できる限りチェックは最小圏で済ませたいのですが、いい方法はありませんでしょうか。 >>781
ブックをzipとして解凍して出てきたxml
(\Book\xl\worksheets\sheet1.xml とか)
の中身みると
<col min="16374" max="16374" width="0" hidden="1" customWidth="1"/>
みたいな感じでどの行、列が非表示なのか書いてあるからそれを拾うとかどうよ >>780
>Int(i / 100)
をDebug.Printしてみる >>781
ドキュメント検査の中に非表示の行・列を削除する機能がある
VBAなら
If Columns(ColumnNumber).Hidden = True Then Columns(ColumnNumber).EntireColumn.Delete
If Rows(RowNumber).Hidden = True Then Rows(RowNumber).EntireRow.Delete
をそれぞれ列数・行数分 >>782
xmlにそんな記載があるんですか。
確かにそれなら出来そうですが、それを解釈させるマクロを書くのは面倒くさそうな感じですね
それに、拡張子をzipに変えるとxmlが取り出せるというのを知らない人は多そう
(自分が使うために作るんですが、欲しいと言ってる人にあげる予定なので、難しいことは抜きにしたいかな…)
>>784
実務的にはそれを For … To … Step -1 で回すか>>782で調べたものを使うんでしょうが、
そこが問題なんですよね…
ところで、Columns(ColumnNumber)ってRangeオブジェクトを返すと思うのですが、
EntireColumnが必要なんですか?
いえ、Rows、Columnsあたりはよく分かってない部分があるので、自分の認識不足かも知れませんが。 ■ このスレッドは過去ログ倉庫に格納されています