Excel VBA 質問スレ Part64at TECH
Excel VBA 質問スレ Part64 - 暇つぶし2ch170:デフォルトの名無しさん
19/12/18 20:40:24.52 eYqAoNFQM.net
Officeクリップボードをクリアするにはどうしたらよいですか?

171:デフォルトの名無しさん
19/12/18 21:42:34.31 enbCu13E0.net
>>161
ちゅまん

172:デフォルトの名無しさん
19/12/18 22:44:40.50 ycaRvEPMx.net
>>171
かわいい

173:デフォルトの名無しさん
19/12/18 23:33:23.01 kDyrT7eN0.net
>>170
その文言でぐぐれ

174:デフォルトの名無しさん
19/12/19 17:59:43.75 OOaAV86L0.net
ちょっと教えて下さい
自動的に新しいcsvファイルが保存されてくるフォルダがあって
新しいファイルが保存されたら処理をするってコードを作りたいんですが
どんな感じにしたらよいのかアイデアが浮かびません
イメージは処理開始としてから処理停止とするまでずっと監視と処理をし続ける感じです
正攻法ってどんな感じでしょう?

175:デフォルトの名無しさん
19/12/19 18:07:29.48 FlPgbXc+r.net
定期的にフォルダの更新日時かファイル数を比較

176:デフォルトの名無しさん
19/12/19 19:15:47.42 PZllcG7iF.net
C#に乗り換えてFileSystemWatcherかな
そういうのはサービスにして常時起動したいだろ?どのみちVBAじゃ無理がある

177:デフォルトの名無しさん
19/12/19 20:13:02.64 r3z4nZn+0.net
>>174
csvデータは一般機能のpower queryで「フォルダ指定」で取得してから、何らかの加工をする必要があればVBAでやるというのはどうでしょう?

178:デフォルトの名無しさん
19/12/19 20:52:54.37 Uvgz+C1W0.net
>>174
Application.OnTimeでググればいろいろ出てくる
Excel/VBA: 特定のフォルダ内のファイルの更新状況を監視するマクロ
URLリンク(pineplanter.moo.jp)

179:174
19/12/19 21:50:34.66 OOaAV86L0.net
コメントありがとうございます。
C#は知識がなくて・・・。1か月後に必要なんですが今からいけるかな。。。
>>177
すこし理解に時間がかかっています。内容確認してみます。
>>178
参考例ありがとうございます。
更新したファイルだけ処理をしたいのですが、この例だと毎回全ファイルを読むみたいなので
例えば処理したファイル名はシートに記録しておいて
更新起動時に毎回処理したかしてないか判断するのも追加するって感じですかね。

180:デフォルトの名無しさん
19/12/19 22:24:23.56 O8pz/cv40.net
>>179
悪用すると色々できそうだな

181:デフォルトの名無しさん (ワッチョイ 9f2c-1ZZR)
19/12/20 10:20:51 A+TGdcd90.net
ファイルのタイムスタンプで判断すれば?

182:デフォルトの名無しさん (ワッチョイ 9f2c-1ZZR)
19/12/20 11:57:58 A+TGdcd90.net
Ruby で、ファイルの最終更新時刻を取得する

fs = File::Stat.new( "./a.txt" )
p fs.mtime #=> 2018-01-16 13:36:40 +0900 最終更新時刻

p current = Time.now #=> 2019-12-20 11:54:02 +0900
p current - fs.mtime, fs.mtime - current

#=> 60733042.351125, -60733042.351125

183:デフォルトの名無しさん
19/12/20 15:07:41.92 INeYifjy0.net
>>179
ファイルのアーカイヴ属性を変更すればいいよ。これなら新規以外にも、変更ファイルも拾えるはず。

184:デフォルトの名無しさん
19/12/20 15:08:25.80 CBAVBsMi0.net
馬鹿ばっか

185:デフォルトの名無しさん
19/12/20 15:24:50.75 CkbICV7EM.net
ハゲばっか

186:デフォルトの名無しさん
19/12/20 20:34:34.24 UWWbjOVR0.net
馴鹿ばっか

187:デフォルトの名無しさん
19/12/21 11:10:49.09 lLQbKr+9r.net
クリスマスだから

188:デフォルトの名無しさん
19/12/21 19:08:13.95 reWWVMAr0.net
セルに指定したフォントの情報などを変数(オブジェクト?)として
保持して、別のセルに貼り付けることはできないでしょうか
Public Sub textMacro()
ActiveSheet.Cells(1, 1).Select
ActiveCell.Value = "testTESTtest"
ActiveCell.Characters(Start:=5, Length:=4).Font.ColorIndex = 3
End Sub
こんな感じで、文字列の途中で色を変えたりフォントを変えたり
した情報を構造体配列として保持しておいて、ソートしたり
特定条件で抽出したりしたデータを、書式ごと別のセルに
貼り付けたいのです
上記のようなコードで一旦別のワークシートに書き込んでやって、
そこを参照してコピーすれば解決します
ですが作業用ワークシートを作るのが美しくないので、なにか
方法がないものかと悩んでいます

189:デフォルトの名無しさん
19/12/21 19:30:42.69 EDn7hR2k0.net
>>188
rangeにでも入れとけばいいんじゃないの

190:デフォルトの名無しさん
19/12/21 19:57:20.88 reWWVMAr0.net
>>189
言葉足らずだったかもしれません
188で書いたコードのように、一旦どこかのセルに書式を設定するのではなく、
書式設定済みのデータを内部で生成したあとでセルに貼りたいのです

191:デフォルトの名無しさん
19/12/21 20:19:43.43 Z2fXXpuT0.net
アドバンスフィルタ使うとか。

192:デフォルトの名無しさん
19/12/21 21:42:26.79 u7lOGHHR0.net
>>188
activecellは rangeオブジェクト
rangeオブジェクトは必ずどこかの実態セルに紐付けしないと設定、参照できない
なので、実態セルを使いたくなければ、仮想的に実装するしかない
全てを網羅するには、それは非現実的(ムダ)だから私ならやらない
あとの判断はお任せする
(may be. GL)

193:デフォルトの名無しさん
19/12/21 21:50:56.66 vmSiEfoS0.net
ここには北海道のグラサンのスーパーハゲザーこないのー?

194:デフォルトの名無しさん
19/12/21 22:03:15.47 xOT/WAE8x.net
>>190
セルのコピーで済む処理をわざわざスクラッチする意味があるのか?
マクロ言語で車輪の再発明をするのは無駄だし結果的に美しくないものが出来上がって終わりなことが多いぞ

まぁ文字列書式の取得をするならRange.Charactersクラスを対象にForで一文字ずつループを回して、Fontプロパティで取れる各フォント属性を調べて構造体配列に格納していけば良い
Characters(i, 1)とか指定すれば一文字ずつ調べられる
具体的にはFontクラスのうち
Bold, ColorまたはColorIndex, FontStyle, Italic, Name, Size, ThemeColor, ThemeFont, Underlineあたりを取得しとけば何とかなるんじゃないか

195:デフォルトの名無しさん
19/12/21 22:26:10.14 reWWVMAr0.net
>>192
>>194
内部データとして、特定の文字だけボールドにしたり赤字にしたりしたデータを
保持しておいて、それをそのままセルに貼れないだろうかという趣旨でした
全然実用性のない例ですが、何らかの名簿データを元データとして入力すると
して、「佐藤」という名字だけを赤で表示したい、というケースがあったとします。
このとき、表示するときに年齢別だったり性別だったりの条件で抽出したりする
際に、毎回セルにデータを書き込むときにフォントの設定をする必要があるのか、
一度設定済みのデータを貼れば済むような方法があるのか、という質問でした
現在は毎回貼るたびにフォントの設定をしているので、もっと効率的な方法が
あるのではないかと考えた次第
でも残念ながら、どうやらなさそうですね
確かにセルをコピーすれば済む話なので、断念します

196:デフォルトの名無しさん
19/12/21 23:09:32.16 u7lOGHHR0.net
>>195
鈴木 健二
の鈴木だけを赤文字に設定したセルの書式コピーして
鈴木 太郎
セルに貼り付けしても、鈴木だけを赤にはできなかった
(バージョンによって違うかもだが)
ロジックでやるしかないんじゃないかな
鈴木or宇都宮を赤にするとか

197:デフォルトの名無しさん
19/12/21 23:41:09.25 reWWVMAr0.net
>>196
色々ありがとうございます
今回やりたいのは、鈴木だけを赤くした「鈴木 健二」というセルを作るのに、
事前にデータを作ってからセルに貼り付けたいということですから、
「鈴木 太郎」の「鈴木」が赤くならなくても特に問題ありません
この例で言うなら、コピペ以外の方法で、同じく鈴木だけが赤くなった鈴木健二の
セルを効率よく作りたい、ということですね

198:デフォルトの名無しさん
19/12/22 00:19:45.02 4IcKy9Blx.net
>>197
構造体とかでパラメータ設定すればやれないことはない
書式設定対象の文字列の開始オフセット位置と文字列長、フォント属性の設定値からなる構造体配列を作って、一括でRangeオブジェクトのプロパティに代入すれば良い
ただしパラメータを動的に指定する処理やらUIやらを構築する手間とか考えたら結局セルコピーでよくねってなる

199:デフォルトの名無しさん
19/12/22 09:13:02.87 m/MVfWr2M.net
office2010から2016へ変えたらマクロの遅さが気になって
セルコピーを別の方法でやれないか考えてる

200:デフォルトの名無しさん
19/12/22 10:54:11.14 sgFeqmUl0.net
マクロが遅いんじゃなくてPCのスペックが貧弱過ぎるんじゃないか

201:デフォルトの名無しさん
19/12/22 11:54:58.14 M+v9sXGU0.net
>>198
そこまでする価値はないですね
自分が知らないだけで、なにか簡単な方法があるのではないかと思って
いたのですが、そもそも需要がない動作なんでしょうね

202:デフォルトの名無しさん
19/12/22 12:26:41.63 cYIprE7S0.net
>>199
変えたのはExcelだけか?
実はOSを10に変えた時にExcelも入れ替えたのではなく?

203:デフォルトの名無しさん
19/12/22 14:42:00.45 qo1j1gBdx.net
>>201
そこまでやるならmhtか何かでコード生成してからxls変換してレンダリングする方がいいよねって話になってしまうからな

204:デフォルトの名無しさん
19/12/27 23:18:51.19 89CBNjra0.net
んあ

205:デフォルトの名無しさん
19/12/27 23:55:11.89 kLvnMS830.net
北海道のグラサンスーパーハゲザーはここにはこないのー?

206:デフォルトの名無しさん
19/12/28 10:04:17.04 Ht/sR5FE0.net
北海道にいるんだろ

207:デフォルトの名無しさん
19/12/28 11:09:10.42 iMlStgtR0.net
あなたのハゲにサクセスしたい

208:デフォルトの名無しさん
19/12/28 17:00:07.97 SHykekh8a.net
休みに入って大人しくなったな

209:デフォルトの名無しさん
20/01/01 22:49:57.07 /3koq0Lq0.net
フォルダ名を取得し名前を変える処理をしたいのですが、フォルダ名の頭に0がついているとセルに取り込んだ際、数値扱いされきえてしまいます。何かいい方法ないでしょうか?
ほぼネットから引用したものですが。。
Sub folder()
Dim folderPath As String
folderPath = Sheets(2).[B1]
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim n As Variant
n = fso.GetFolder(folderPath).SubFolders.Count
If (0 < n) Then
Dim I As Long
I = 1
Dim f As Object
For Each f In fso.GetFolder(folderPath).SubFolders
Cells(3 + I,1).Value=Str(f.Name)
I = I + 1
Next f
End If
End Sub

210:デフォルトの名無しさん
20/01/01 22:54:36.69 Oh0xulqx0.net
>>209
・セルの書式を予め文字列にしておく

Cells(3 + I,1).Value = "'" & Str(f.Name)
・セルに取り込まずに処理する
どれか

211:デフォルトの名無しさん
20/01/01 23:43:11.75 /3koq0Lq0.net
>>210
頭に「'」つける案いただきます!
すっかり頭からぬけておりました。
ありがとうございます!

212:デフォルトの名無しさん
20/01/02 00:01:52.13 KGMPhTA00.net
>>209
頭に'付けるとかセルの表示形式を文字にするとか
それVBAじゃなくてExcelの範疇では

213:デフォルトの名無しさん
20/01/02 00:13:18.61 4cnj/64c0.net
VBAはそもそもビジュアルベーシックフォーアプリケーション
エクセル(他office製品)のための言語
Excelの範疇も何もないよ

214:デフォルトの名無しさん
20/01/02 00:44:32.37 C9nM6Ix2x.net
セルにフォルダ名を入れなきゃならない理由が全く分からない

215:デフォルトの名無しさん
20/01/02 00:52:53.68 m04meMbs0.net
PowerQueryにデータの参照元渡すとか

216:デフォルトの名無しさん
20/01/02 11:28:52.88 yN8yk3jo0.net
マクロでCSV書き出ししたデータですが
どうも1行ごとに最後のセルの末尾に勝手に改行コードが入っているようです
これはなんとかならないでしょうか
その改行コードもCRLFで言うところのCRだけのようで、見かけ上全くわかりません
aaa,ddd,ccc
とあったら、cccの末尾に見えないCFが張り付いている感じです
urlエンコードで見ると ccc%0D みたいな感じです
どうしたら綺麗に書き出せますか?

217:デフォルトの名無しさん
20/01/02 12:02:15.68 33UW29zWd.net
>>216
改行コードをなくした場合、行の区切りはどうするの?
完全に思い通りにしたい時はテキストファイルの生成を自力でやるしかない

218:デフォルトの名無しさん
20/01/02 12:48:11.80 /IgTqK/90.net
セル内で改行しても平気か確認した方がいい

219:デフォルトの名無しさん
20/01/02 12:53:49.13 KGMPhTA00.net
>>216
ExcelではLFがセル内改行、CRLFが次の行
CRは意味を持たないので入ってても改行されない
消したければ普通にその文字を消せばいい

220:デフォルトの名無しさん
20/01/02 12:58:08.65 KGMPhTA00.net
あと勝手に入ってるのではなく元々のテキストファイルに入ってるんだろう

221:デフォルトの名無しさん
20/01/02 15:17:06.96 yN8yk3jo0.net
216です
>>217
csvの中のデータとして配列に入っています。書き出したcsvは普通に数行のカンマ区切りです。
それをjavascriptで配列へ取り込みしたときに、
二次元配列データの一行の最後のデータの末尾に毎行追加されている感じです。
配列内
aaa,ddd,ccc%0D
aaa,ddd,ccc%0D
aaa,ddd,ccc%0D
csvとしての改行・配列構成は崩れていません。
ちなみに書き出しは
ActiveWorkbook.SaveAs Filename:=csvName, FileFormat:=xlCSV
です。win7時代に作ったマクロをwin10で使っていますが、それもあるんでしょうか…
>>219
EXCELの改行仕様は知りませんでした。ありがとうございます。
末尾に列を1つ増やしたら取りたいデータにはつかなくなったので
(おそらく、増やした列に%0Dが移動したのかとw)、
若干気持ち悪いですが、趣味プログラムなので運用で対応します。

みなさんありがとうございました。

222:デフォルトの名無しさん
20/01/02 16:37:15.04 yYKIO5swM.net
北海道のグラサンスーパーハゲザーはここにはこないのー?

223:デフォルトの名無しさん
20/01/02 17:52:03.38 YgEQc8yF0.net
>>216
Excelのsheetに読み込んでから、CRLF等を""に置換する
ではダメ?

224:デフォルトの名無しさん
20/01/02 21:25:07.68 ShHqIFTQ0.net
一般論として例えば、Ruby のCSV の規格にも、
行区切り文字・列区切り文字・クォート文字などがある
特に設定しないデフォルトでは、それらは、
改行コード・カンマ・ダブルクォーテーションになる
もし、それらが無ければ、CSVの要件を満たさないw
つまり、CSVの規格ではありませんw

225:デフォルトの名無しさん
20/01/02 23:23:58.57 1vLrUBFwa.net
ルビカスが何を言おうと、世の中ではExcelが出力するCSVが標準のCSVだ

226:デフォルトの名無しさん
20/01/03 10:32:03.45 R/lajPDg0.net
CSVは自前でテキストファイル読み込み+自前で区切り扱いが基本。
区切りが何であろうと、データの形式が何であろうと全て自分でコントロール出来るし速度も速い。

227:デフォルトの名無しさん
20/01/03 12:29:48.12 V2sewd5k0.net
同意。てか、Excel標準のCSV読み込み仕様もうちょっとなんとかなりませんかね・・・?
それはさておき>>216>>221(もう見てないかもだけど)
その「CSVファイルを配列に取り込むJavaScript」のコードに問題があるんじゃないかなと。
具体的には\n(%0A)でSplitしてるから\rが残ってるだけだと思うけどな。

228:デフォルトの名無しさん
20/01/03 18:33:14.85 LoHkYQxe0.net
使い続ける以上CSVとの戦いは続くのだ

229:デフォルトの名無しさん
20/01/03 18:50:10.73 k7eftYc7x.net
モダンExcelが一般化してきた今ならクエリでCSVの開き方を指定して読み込むのがいいんじゃないの
CSVをエクセルで直接開くといろいろ勝手なことをしてくれるので

230:デフォルトの名無しさん
20/01/03 19:06:41.78 esau8hBed.net
PowerQueryのコードを書くのはVBA以上にハードルが高いぞ

231:デフォルトの名無しさん
20/01/03 19:55:22.39 3Uhjf7eSM.net
PowerQueryコード書かなきゃいけないの?
GUIでできる範囲だと不十分なの?

232:デフォルトの名無しさん
20/01/03 19:58:54.81 k7eftYc7x.net
そんなにハードル高いか?
テキストファイルの読み込みの処理をスクラッチするより明らかに楽だし処理速度も速いと思うが
例えば4列のCSVをSJIS(Windows-J31)でデコードしてカンマ区切りで読み込んでSheet1のA1セルから書き出すとしたらこんな感じ
Sub ReadCSV()
  With Worksheets("Sheet1")
  With .QueryTables.Add(Connection:="TEXT;ソースファイルのパス", Destination:=.Range("A1"))
    .TextFilePlatform = 932
    .TextFileCommaDelimiter = True
    .RefreshStyle = xlOverwriteCells
    .TextFileColumnDataTypes = Array(xlTextFormat, xlTextFormat, xlTextFormat, xlTextFormat)
    .Refresh
    .Delete
  End With
  End With
End Sub

233:デフォルトの名無しさん
20/01/03 20:07:37.72 k7eftYc7x.net
PowerQueryだったらもっと簡単だろう
Csv.Documentにソースのパスとメタ情報を渡してテーブルを取得するだけだしGUIでステップ記録できる

234:デフォルトの名無しさん
20/01/03 20:56:20.20 LoHkYQxe0.net
CSV読み込みの話してんのになんで書き込みの回答してんだろうこの子

235:デフォルトの名無しさん
20/01/03 21:32:33.80 k7eftYc7x.net
>>234
>>232のコードについて言ってるなら、読み込んでシートに書き出してるわけで、クエリの使い方としてはオーソドックス処理だぞ
読み込んだ結果をシートに書き出さないならODCにデータモデルとして保存すれば良い

236:デフォルトの名無しさん
20/01/03 22:10:30.43 k7eftYc7x.net
>>235
ODCにデータモデルとして→×
データモデルとして→○

237:デフォルトの名無しさん
20/01/03 22:23:49.87 X7hap7HH0.net
>>230
全然。
基本的にはリボンの機能使った操作が1つずつのステップになっていく。
ステップの1つ1つがマクロみたいなもの。
「詳細クエリー」を見て初めて「コードはこうなってるんだ・・・」
という感じ。
もっとも、M Functionのレファレンスやパラメータあたり説明が
英語でもまだ不親切なので、
使えてない部分が多分にはあるけど。
ただ、VBAのように出来る範囲が広範囲なわけではなく、
取得したデータの成形に特化してる。
スクレイピングについては
Pythonみたいに取得対象のWeb画面で
IDやパスワード入力するとか、
ボタンを押すみたいなことも出来ない模様。

238:デフォルトの名無しさん
20/01/03 22:43:05.12 3zmXV6NNx.net
データの成形に特化と言ってもVBAでスクラッチすると恐ろしく面倒なJoinとかのSQLチックな処理は全て実行できるので、データ処理の面ではVBAより手軽で便利
あとAccessDBやSQL ServerやOBDCはもちろん、ファイルシステムとかExchangeサーバとかSharePointリストとか、およそデータベースとして扱えるデータストアの情報は全て取得できる
フォルダ内のファイルの属性情報を取得する処理のためだけにいちいちFileSystemObjectのインスタンスとかを使ってスクラッチする必要がなくなると考えればめちゃくちゃ便利

239:デフォルトの名無しさん
20/01/04 15:59:54.32 dDunGyfu0.net
>>227
みています
ご指摘の通り、\nでspritかけてました!
\nってCR+LFじゃなかったんですね…
この後都合があるのですぐには試せませんが、
その辺確認してみます。
ありがとうございます!

240:デフォルトの名無しさん
20/01/04 16:12:12.74 8fEwlZFG0.net
\nはLFじゃなかったか
windowsの改行は\r\nだったような

241:デフォルトの名無しさん
20/01/04 17:52:00.86 ALZ03HNg0.net
EditBoxでは\r\nでRichEditBoxでは\nだねWindows

242:デフォルトの名無しさん
20/01/04 17:56:48.54 +4weKQQc0.net
CR+LFの定数の vbCrLf か vbNewLine でいいんじゃね

243:デフォルトの名無しさん
20/01/04 18:04:55.94 8fEwlZFG0.net
vbNewLineいいよね

244:デフォルトの名無しさん
20/01/04 18:23:56.78 ZrFrOERU0.net
>>239
やっぱり。
>>240-241の人もいうとおり、OSだけじゃなくAPI関数ごとに改行コードの取扱いが違ったりすることもあるし、
テキストエディタに内蔵されてる正規表現なんかでも「\n」でCRLFに対応させてる例もあったりするから、
その辺はトライ&エラーで覚えていくといいとおもうよ。

245:デフォルトの名無しさん
20/01/04 18:40:58.78 HwWXKum00.net
北海道のグラサンスーパーハゲザーはここにはこないのー?


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch