Excel VBA 質問スレ Part64

■ このスレッドは過去ログ倉庫に格納されています
2019/12/02(月) 23:43:54.18ID:ngrqyTy20
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part63
https://mevius.5ch.net/test/read.cgi/tech/1568630099/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/12/15(日) 16:04:03.19ID:jQWuvGce0
止めは先が100%大惨事になるだろうな
2019/12/15(日) 16:08:21.42ID:STgulX1kx
>>122
OK
シートの並び順とシートのIndexは連動しているから

ただ他人と共有するブックでシートIndexに依存したコードを書くならば、シートの追加や削除や並び替えをユーザー側で行えなくするために、ブック構成の保護をかける必要はあるかも
2019/12/15(日) 20:43:05.99ID:FsE4lMSlp
>>122
非表示がなければ
2019/12/15(日) 21:19:26.62ID:SHKnrJYm0
インデックス値とシートの順にそんな保証あったかな
使い古しのワークブックだと最初のシートがSheet1とは限らない気がするし
2019/12/15(日) 21:53:45.41ID:jQWuvGce0
sheet1じゃなくてsheet(1)だぞ
左端がsheet(1)
2019/12/15(日) 22:30:02.10ID:STgulX1kx
>>126
CodeNameの話じゃなくてシートインデックスの話だぞ
129デフォルトの名無しさん (ワッチョイ a702-G5xG)
垢版 |
2019/12/15(日) 23:11:58.85ID:HW9FgRDW0
VBAで拡張子がDWGのCAD図面ファイルから文字列と数字を抜き出してエクセルに貼り付けたいんだけどなんかイイ方法ない?
130デフォルトの名無しさん (ワッチョイ 5f01-uKDx)
垢版 |
2019/12/15(日) 23:42:09.44ID:LATD77rz0
AutocadのVBA使えば。
131デフォルトの名無しさん (アウアウウー Sa3b-G5xG)
垢版 |
2019/12/15(日) 23:44:25.04ID:4M9N/f7Ka
>>130
AutoCADのソフトは持ってないんだけど出来るの?
2019/12/16(月) 02:59:51.17ID:81b5k4YR0
DXFファイルはないのか?
133デフォルトの名無しさん (ワッチョイ efaa-G5xG)
垢版 |
2019/12/16(月) 08:14:35.94ID:ylV0M4Pv0
>>132
ないんだ
2019/12/16(月) 08:19:35.03ID:MkhWpp+30
>>129
VBAからほかのアプリをコントロールする方法があるから、適当なフリーウェアでDXFに変換
DXFはテキストファイルだから文字列がそのまま入ってる
135デフォルトの名無しさん (ワッチョイ efaa-G5xG)
垢版 |
2019/12/16(月) 09:20:06.30ID:ylV0M4Pv0
>>134
会社だからあんまりフリーソフト入れたくないんだよなぁ
2019/12/16(月) 12:08:57.72ID:t2/k2gwa0
どこまで読み取りたいのか分からんが、タイトルとかコメントとか作者とかは読み取れるんじゃない?

AutoCAD入ってなくても動くか分からんけどCOM用のAPI使って読み取るサンプルならAutodeskのフォーラムに有ったぞ。
2019/12/16(月) 18:36:30.35ID:81b5k4YR0
>>135
業務上必要だと上司に相談して無理ならできませんでいいやん
2019/12/16(月) 19:13:38.22ID:zd6rche20
DWGファイルを扱うってことはどっかの部署ではAutoCADが動いてるわけだから環境借りるなりすればいい
2019/12/16(月) 19:29:44.71ID:A0F2PFYR0
何がやりたいのか(最終目的が何なのか)分からないが、
AutoCADのスレで質問した方がいいと思う

AutoCAD総合スレ part7
https://mevius.5ch.net/test/read.cgi/bsoft/1556080032/
2019/12/16(月) 20:17:26.44ID:+vV5KnGFa
そんなデータの編集業務ってブラック企業じゃね
141デフォルトの名無しさん (ワッチョイ efaa-G5xG)
垢版 |
2019/12/16(月) 20:25:39.43ID:ylV0M4Pv0
図面から読み取る仕事が多くてVBAで自動化できないかと考えてるだけだよ。ブラック企業でもないよ。
バイナリファイルじゃ読み取れないし、フリーソフトで一つ一つテキストファイルDXFに変換っていうのもなかなかナンセンスな気がする
142デフォルトの名無しさん (スッップ Sd02-RPlZ)
垢版 |
2019/12/16(月) 21:37:32.27ID:CfM/IfFed
>>141
お前が馬鹿なだけだろ
2019/12/16(月) 21:44:36.78ID:UUZzkS6j0
よかったな天才に教えて貰えるぞ
144デフォルトの名無しさん (ワッチョイ a702-G5xG)
垢版 |
2019/12/16(月) 21:59:33.00ID:UZ2w46Iu0
>>141だけど天才の>>142に教えてほしい。どうしたらいい?
2019/12/16(月) 23:05:55.21ID:ArNGhSEVa
その図面データに営利目的で使用してはいけないって書いてないか?
146デフォルトの名無しさん (アウアウウー Sa3b-G5xG)
垢版 |
2019/12/16(月) 23:19:30.71ID:zUbFdDFya
社内の人が作ってる図面なんだが
2019/12/17(火) 01:41:33.76ID:fNjlS94d0
だったら保存形式かえてもらえばすむやん
2019/12/17(火) 02:29:00.49ID:7tj6sNHj0
CADファイルならVISIOで開けるじゃね
VISIOにVBA載ってなかったか
2019/12/17(火) 02:51:35.82ID:Ef4LKPDY0
DWGもCOM経由でExcelから扱える
2019/12/17(火) 08:50:39.06ID:7E3y3B+ga
Excelで作成したものをフリーOfficeのCalcで開こうとするとエラーが出るので、違うPCのExcelにコードを写したいのですが、どうすれば良いでしょうか?
sheetは5枚でそれぞれデータが入力されています。
そのシートをコピーしてマクロコードをコピペすればできるのでしょうか?
コピーはできても貼り付ける場所が分かりません。教えてください。
2019/12/17(火) 09:41:37.65ID:vQ+5LFSo0
マクロは互換性ほぼ無いからなあ
2019/12/17(火) 15:37:53.37ID:/A3hSSic0
>>150
よく分からん。
ファイルをコピーしてそのファイルをそのまま使えば良いんじゃね?

要はさ、そのマクロのコ―ドがExcelの何を使っているかで変わるだろ。
コードを追って必要なものをコピーすれば使えるだろうよ。
2019/12/17(火) 20:23:29.92ID:3Fa5Zu3xa
慣れてる人ならできるかもしれんが
初心者じゃ無理だろ、互換性ないし
2019/12/17(火) 20:37:54.29ID:WWM9H/Hw0
OOoのVBAは相当単純なものじゃないと動かなかったような
色々省略するのもダメだったような気がする
2019/12/17(火) 20:55:11.10ID:BpmC86c/0
OOOBasicなんてあるんだな
勉強する人いるの?
2019/12/17(火) 21:06:28.96ID:WWM9H/Hw0
OOOBasicというのか・・・
数年前きまぐれにちょっと触って、あまりの互換性のなさに逃げ出したわ
157デフォルトの名無しさん (ワッチョイ 1b8e-RPlZ)
垢版 |
2019/12/17(火) 23:47:48.67ID:eRzCNyCK0
>>150
馬鹿は死ね
158デフォルトの名無しさん (ワッチョイ 5f01-uKDx)
垢版 |
2019/12/18(水) 02:07:35.42ID:ksLRDXXy0
なんでBasicにしたんだろね。
後発なんだから選べたはずなのに。
2019/12/18(水) 02:16:13.86ID:mwLPhsOw0
Cに似せるほうが大変だろう
2019/12/18(水) 07:45:18.46ID:enbCu13E0
>>158
VBが売れたから、機能はほぼそのままにVBAとしてofficeに搭載した
VCの登場はもっと後
時系列的に仕方ないとは思う
俺もCの方が良いとは思う
2019/12/18(水) 07:46:31.18ID:5n7ujQMK0
oooの話だろ
2019/12/18(水) 08:15:59.63ID:Bw/0QRZma
>>152

PC1のデータをPC2に移したい。でも、PC2にUSBなど外部のものを差し込めないしネットには繋がるけど仮想?か分からないけどデータをPC2のデスクトップとかドキュメントに保存できないので、
データの中身をコピーしてPC2でExcelを開きペーストすれば良いのではと考えたのですが、
Excelのデータを丸々コピーするにはまずシートをコピペしてその後マクロコードをコピペすれば良いのでしょうか?どこに貼り付ければ良いのかわかりません。
2019/12/18(水) 14:12:35.99ID:HS0oeyOA0
PC2のどこに移したいの?
PC2でデータを開き データの中身をコピーして Excel(新規ブック)を開きペーストすれば良い
でもその新規ブックは保存できないんでしょ?
2019/12/18(水) 14:53:42.73ID:mwLPhsOw0
会社のPCなら上司にまず先に相談しろ
2019/12/18(水) 15:30:08.92ID:Bw/0QRZma
>>163
PC2のデスクトップ
Excelを新規で開けば保存できる。
もしくは開きたいExcelのデータCalcでなら開ける。
Calcで開いてコピーしたものをExcelに貼り付けたら出来るのか?セル全範囲コピーして貼り付けてマクロコードもコピーして。
166デフォルトの名無しさん (ワッチョイ 1b8e-RPlZ)
垢版 |
2019/12/18(水) 16:28:12.29ID:cW21FM1r0
>>162
馬鹿は死ね
2019/12/18(水) 18:12:16.35ID:2hbVJNuaa
シートの書式がコピーできるかな?
2019/12/18(水) 18:12:36.66ID:2hbVJNuaa
セルね
169デフォルトの名無しさん (ワッチョイ e793-goRK)
垢版 |
2019/12/18(水) 18:28:12.80ID:jQts0Cg90
>>167
死ね
2019/12/18(水) 20:40:24.52ID:eYqAoNFQM
Officeクリップボードをクリアするにはどうしたらよいですか?
2019/12/18(水) 21:42:34.31ID:enbCu13E0
>>161
ちゅまん
2019/12/18(水) 22:44:40.50ID:ycaRvEPMx
>>171
かわいい
2019/12/18(水) 23:33:23.01ID:kDyrT7eN0
>>170
その文言でぐぐれ
2019/12/19(木) 17:59:43.75ID:OOaAV86L0
ちょっと教えて下さい

自動的に新しいcsvファイルが保存されてくるフォルダがあって
新しいファイルが保存されたら処理をするってコードを作りたいんですが
どんな感じにしたらよいのかアイデアが浮かびません

イメージは処理開始としてから処理停止とするまでずっと監視と処理をし続ける感じです
正攻法ってどんな感じでしょう?
2019/12/19(木) 18:07:29.48ID:FlPgbXc+r
定期的にフォルダの更新日時かファイル数を比較
2019/12/19(木) 19:15:47.42ID:PZllcG7iF
C#に乗り換えてFileSystemWatcherかな
そういうのはサービスにして常時起動したいだろ?どのみちVBAじゃ無理がある
2019/12/19(木) 20:13:02.64ID:r3z4nZn+0
>>174
csvデータは一般機能のpower queryで「フォルダ指定」で取得してから、何らかの加工をする必要があればVBAでやるというのはどうでしょう?
2019/12/19(木) 20:52:54.37ID:Uvgz+C1W0
>>174
Application.OnTimeでググればいろいろ出てくる

Excel/VBA: 特定のフォルダ内のファイルの更新状況を監視するマクロ
http://pineplanter.moo.jp/non-it-salaryman/2016/12/30/excel-vba-folder-monitor/
179174 (ワッチョイ f71f-M3rQ)
垢版 |
2019/12/19(木) 21:50:34.66ID:OOaAV86L0
コメントありがとうございます。
C#は知識がなくて・・・。1か月後に必要なんですが今からいけるかな。。。

>>177
すこし理解に時間がかかっています。内容確認してみます。

>>178
参考例ありがとうございます。
更新したファイルだけ処理をしたいのですが、この例だと毎回全ファイルを読むみたいなので
例えば処理したファイル名はシートに記録しておいて
更新起動時に毎回処理したかしてないか判断するのも追加するって感じですかね。
2019/12/19(木) 22:24:23.56ID:O8pz/cv40
>>179
悪用すると色々できそうだな
2019/12/20(金) 10:20:51.92ID:A+TGdcd90
ファイルのタイムスタンプで判断すれば?
2019/12/20(金) 11:57:58.87ID:A+TGdcd90
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
2019/12/20(金) 15:07:41.92ID:INeYifjy0
>>179
ファイルのアーカイヴ属性を変更すればいいよ。これなら新規以外にも、変更ファイルも拾えるはず。
184デフォルトの名無しさん (ワッチョイ f78e-H4w9)
垢版 |
2019/12/20(金) 15:08:25.80ID:CBAVBsMi0
馬鹿ばっか
185デフォルトの名無しさん (ブーイモ MMfb-BnkS)
垢版 |
2019/12/20(金) 15:24:50.75ID:CkbICV7EM
ハゲばっか
2019/12/20(金) 20:34:34.24ID:UWWbjOVR0
馴鹿ばっか
2019/12/21(土) 11:10:49.09ID:lLQbKr+9r
クリスマスだから
2019/12/21(土) 19:08:13.95ID:reWWVMAr0
セルに指定したフォントの情報などを変数(オブジェクト?)として
保持して、別のセルに貼り付けることはできないでしょうか

Public Sub textMacro()
ActiveSheet.Cells(1, 1).Select
ActiveCell.Value = "testTESTtest"
ActiveCell.Characters(Start:=5, Length:=4).Font.ColorIndex = 3
End Sub

こんな感じで、文字列の途中で色を変えたりフォントを変えたり
した情報を構造体配列として保持しておいて、ソートしたり
特定条件で抽出したりしたデータを、書式ごと別のセルに
貼り付けたいのです

上記のようなコードで一旦別のワークシートに書き込んでやって、
そこを参照してコピーすれば解決します
ですが作業用ワークシートを作るのが美しくないので、なにか
方法がないものかと悩んでいます
2019/12/21(土) 19:30:42.69ID:EDn7hR2k0
>>188
rangeにでも入れとけばいいんじゃないの
2019/12/21(土) 19:57:20.88ID:reWWVMAr0
>>189
言葉足らずだったかもしれません

188で書いたコードのように、一旦どこかのセルに書式を設定するのではなく、
書式設定済みのデータを内部で生成したあとでセルに貼りたいのです
2019/12/21(土) 20:19:43.43ID:Z2fXXpuT0
アドバンスフィルタ使うとか。
2019/12/21(土) 21:42:26.79ID:u7lOGHHR0
>>188
activecellは rangeオブジェクト
rangeオブジェクトは必ずどこかの実態セルに紐付けしないと設定、参照できない
なので、実態セルを使いたくなければ、仮想的に実装するしかない
全てを網羅するには、それは非現実的(ムダ)だから私ならやらない
あとの判断はお任せする
(may be. GL)
2019/12/21(土) 21:50:56.66ID:vmSiEfoS0
ここには北海道のグラサンのスーパーハゲザーこないのー?
2019/12/21(土) 22:03:15.47ID:xOT/WAE8x
>>190
セルのコピーで済む処理をわざわざスクラッチする意味があるのか?
マクロ言語で車輪の再発明をするのは無駄だし結果的に美しくないものが出来上がって終わりなことが多いぞ


まぁ文字列書式の取得をするならRange.Charactersクラスを対象にForで一文字ずつループを回して、Fontプロパティで取れる各フォント属性を調べて構造体配列に格納していけば良い
Characters(i, 1)とか指定すれば一文字ずつ調べられる

具体的にはFontクラスのうち
Bold, ColorまたはColorIndex, FontStyle, Italic, Name, Size, ThemeColor, ThemeFont, Underlineあたりを取得しとけば何とかなるんじゃないか
2019/12/21(土) 22:26:10.14ID:reWWVMAr0
>>192
>>194
内部データとして、特定の文字だけボールドにしたり赤字にしたりしたデータを
保持しておいて、それをそのままセルに貼れないだろうかという趣旨でした

全然実用性のない例ですが、何らかの名簿データを元データとして入力すると
して、「佐藤」という名字だけを赤で表示したい、というケースがあったとします。

このとき、表示するときに年齢別だったり性別だったりの条件で抽出したりする
際に、毎回セルにデータを書き込むときにフォントの設定をする必要があるのか、
一度設定済みのデータを貼れば済むような方法があるのか、という質問でした

現在は毎回貼るたびにフォントの設定をしているので、もっと効率的な方法が
あるのではないかと考えた次第

でも残念ながら、どうやらなさそうですね
確かにセルをコピーすれば済む話なので、断念します
2019/12/21(土) 23:09:32.16ID:u7lOGHHR0
>>195
鈴木 健二
の鈴木だけを赤文字に設定したセルの書式コピーして
鈴木 太郎
セルに貼り付けしても、鈴木だけを赤にはできなかった
(バージョンによって違うかもだが)
ロジックでやるしかないんじゃないかな
鈴木or宇都宮を赤にするとか
2019/12/21(土) 23:41:09.25ID:reWWVMAr0
>>196
色々ありがとうございます

今回やりたいのは、鈴木だけを赤くした「鈴木 健二」というセルを作るのに、
事前にデータを作ってからセルに貼り付けたいということですから、
「鈴木 太郎」の「鈴木」が赤くならなくても特に問題ありません

この例で言うなら、コピペ以外の方法で、同じく鈴木だけが赤くなった鈴木健二の
セルを効率よく作りたい、ということですね
2019/12/22(日) 00:19:45.02ID:4IcKy9Blx
>>197
構造体とかでパラメータ設定すればやれないことはない
書式設定対象の文字列の開始オフセット位置と文字列長、フォント属性の設定値からなる構造体配列を作って、一括でRangeオブジェクトのプロパティに代入すれば良い

ただしパラメータを動的に指定する処理やらUIやらを構築する手間とか考えたら結局セルコピーでよくねってなる
2019/12/22(日) 09:13:02.87ID:m/MVfWr2M
office2010から2016へ変えたらマクロの遅さが気になって
セルコピーを別の方法でやれないか考えてる
2019/12/22(日) 10:54:11.14ID:sgFeqmUl0
マクロが遅いんじゃなくてPCのスペックが貧弱過ぎるんじゃないか
2019/12/22(日) 11:54:58.14ID:M+v9sXGU0
>>198
そこまでする価値はないですね
自分が知らないだけで、なにか簡単な方法があるのではないかと思って
いたのですが、そもそも需要がない動作なんでしょうね
2019/12/22(日) 12:26:41.63ID:cYIprE7S0
>>199
変えたのはExcelだけか?
実はOSを10に変えた時にExcelも入れ替えたのではなく?
2019/12/22(日) 14:42:00.45ID:qo1j1gBdx
>>201
そこまでやるならmhtか何かでコード生成してからxls変換してレンダリングする方がいいよねって話になってしまうからな
2019/12/27(金) 23:18:51.19ID:89CBNjra0
んあ
2019/12/27(金) 23:55:11.89ID:kLvnMS830
北海道のグラサンスーパーハゲザーはここにはこないのー?
2019/12/28(土) 10:04:17.04ID:Ht/sR5FE0
北海道にいるんだろ
2019/12/28(土) 11:09:10.42ID:iMlStgtR0
あなたのハゲにサクセスしたい
2019/12/28(土) 17:00:07.97ID:SHykekh8a
休みに入って大人しくなったな
2020/01/01(水) 22:49:57.07ID:/3koq0Lq0
フォルダ名を取得し名前を変える処理をしたいのですが、フォルダ名の頭に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
2020/01/01(水) 22:54:36.69ID:Oh0xulqx0
>>209
・セルの書式を予め文字列にしておく

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

どれか
2020/01/01(水) 23:43:11.75ID:/3koq0Lq0
>>210
頭に「'」つける案いただきます!
すっかり頭からぬけておりました。
ありがとうございます!
2020/01/02(木) 00:01:52.13ID:KGMPhTA00
>>209
頭に'付けるとかセルの表示形式を文字にするとか
それVBAじゃなくてExcelの範疇では
2020/01/02(木) 00:13:18.61ID:4cnj/64c0
VBAはそもそもビジュアルベーシックフォーアプリケーション
エクセル(他office製品)のための言語
Excelの範疇も何もないよ
2020/01/02(木) 00:44:32.37ID:C9nM6Ix2x
セルにフォルダ名を入れなきゃならない理由が全く分からない
2020/01/02(木) 00:52:53.68ID:m04meMbs0
PowerQueryにデータの参照元渡すとか
216デフォルトの名無しさん (ワッチョイ 0610-mVj1)
垢版 |
2020/01/02(木) 11:28:52.88ID:yN8yk3jo0
マクロでCSV書き出ししたデータですが
どうも1行ごとに最後のセルの末尾に勝手に改行コードが入っているようです
これはなんとかならないでしょうか

その改行コードもCRLFで言うところのCRだけのようで、見かけ上全くわかりません

aaa,ddd,ccc

とあったら、cccの末尾に見えないCFが張り付いている感じです
urlエンコードで見ると ccc%0D みたいな感じです
どうしたら綺麗に書き出せますか?
2020/01/02(木) 12:02:15.68ID:33UW29zWd
>>216
改行コードをなくした場合、行の区切りはどうするの?
完全に思い通りにしたい時はテキストファイルの生成を自力でやるしかない
2020/01/02(木) 12:48:11.80ID:/IgTqK/90
セル内で改行しても平気か確認した方がいい
2020/01/02(木) 12:53:49.13ID:KGMPhTA00
>>216
ExcelではLFがセル内改行、CRLFが次の行
CRは意味を持たないので入ってても改行されない
消したければ普通にその文字を消せばいい
2020/01/02(木) 12:58:08.65ID:KGMPhTA00
あと勝手に入ってるのではなく元々のテキストファイルに入ってるんだろう
221デフォルトの名無しさん (ワッチョイ 0610-pIXJ)
垢版 |
2020/01/02(木) 15:17:06.96ID:yN8yk3jo0
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)、
若干気持ち悪いですが、趣味プログラムなので運用で対応します。


みなさんありがとうございました。
2020/01/02(木) 16:37:15.04ID:yYKIO5swM
北海道のグラサンスーパーハゲザーはここにはこないのー?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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