Excel VBA 質問スレ Part63

■ このスレッドは過去ログ倉庫に格納されています
2019/09/16(月) 19:34:59.04ID:emfTAhXr0
!extend:checked:vvvvv:1000:512

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

※前スレ
Excel VBA 質問スレ Part62
https://mevius.5ch.net/test/read.cgi/tech/1561303297/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/10/30(水) 23:11:10.26ID:iRK6fdCa0
>>529
すまん、コード会社にあるから書けないけど、やりたい事はそんな感じ。

最初にカンマでsplitして配列に入れてからfor〜nextで0からuboundで最後まで繰り返して「-」になってる範囲を数字にバラしてその間の数字を作って配列に入れ直して…

とかやってたらコードぐちゃぐちゃ、頭の中もぐちゃぐちゃに…orz
534デフォルトの名無しさん (ワッチョイ cf8e-FPtM)
垢版 |
2019/10/30(水) 23:22:56.07ID:rL303qhu0
>>533
馬鹿には無理ってことだよ
2019/10/30(水) 23:42:55.97ID:+vGa/LGgH
ソートを自前で書くのは速度的にもメリット無いし作業シート用意した方がいいと思う
そういうとこで苦労するのはちょっと時間の無駄かなとも思うし
2019/10/30(水) 23:56:52.02ID:6F3AzkQ1x
>>533
配列を作るところまでは多分いけるんだろうけど、問題はソートなんじゃないの?
配列のソートをサポートしてる.NETのArrayListオブジェクトはVBAでも使えるので、CreateObject("System.Collections.ArrayList")でインスタンス生成してAddメソッドで配列を渡して使うといいよ
Revereメソッドを噛ませてからToArrayメソッドで再度配列化して配列変数に再格納すれば一発で降順ソートされた配列を取得できる
2019/10/31(木) 01:50:11.06ID:Xu0ModTh0
Excel2016/32bitで作成したマクロをExcel2019/64bitのパソコンに移動すると途中でExcel自体が落ちてしまいます
この場合、2019にしたこと、64bitにしたこと、どちらが原因と考えられるでしょうか?
2019/10/31(木) 06:48:15.19ID:P+363w9Wa
そのくらいしらべられないの?
2019/10/31(木) 08:04:58.17ID:6oU9RGLEx
>>537
動かないマクロファイルのファイル形式は?
2019/10/31(木) 10:03:55.60ID:Xu0ModTh0
>>538
調べてもわかりませんでした
>>539
xlsmです
2019/10/31(木) 10:04:33.47ID:Xu0ModTh0
ちなみに動く時もありますがたまに落ちるという不安定な状態です
542デフォルトの名無しさん (ワッチョイ de8e-D9gH)
垢版 |
2019/10/31(木) 11:41:33.83ID:EmOHV2200
また馬鹿が来た
2019/10/31(木) 12:23:33.00ID:aNgqFqurd
>>540
何をどう調べてどういう結果になったの?
2019/10/31(木) 12:30:33.86ID:oEJHLRECM
533です。
結局分割をしたデータをセルに置いてソートをさせて配列に入れるコードで問題なく動きました。
ありがとうございました。
変にVBAてわ全てやろうとせずにすればここまで時間かけずに済んだのですね…orz
2019/10/31(木) 12:42:50.28ID:H1H2bMOCM
どうせマクロ作った奴が手抜きしててエラーになったらApplication.Quit()してるとかじゃね
みんなエスパーじゃないんだからコード上げられないなら自分でチマチマデバッグしなよ
2019/10/31(木) 16:13:16.49ID:yyoRZlBtM
>>518
>>521
ありがとうございます
2019/11/01(金) 00:20:58.64ID:bbcNS1Ni0
VBSスレが過疎り過ぎているのとWSHのスレが無いことから、ここでVBSの質問させて下さい。

WshShellのRunメソッドを使ってTortoiseSVNのダイアログを呼び出すプログラムを書いているのですが、引数1を入れてもウィンドウが最前面に来てくれません。
Runした後にAppActivateメソッドを使ってもだめです。誰か、解決策をご存じの方、よろしくお願い申し上げます。
2019/11/01(金) 00:46:23.89ID:txYCNlM40
tortoiseSVNとやらを触った事ないけど、
tortoiseSVNだけ起こる事象なの?他のNotepadとかでは試しました?
2019/11/01(金) 01:08:36.00ID:txYCNlM40
spy++とかで窓id探ってapi使ってhandleできないかな
2019/11/01(金) 01:38:24.11ID:txYCNlM40
>>536
レコードセット以外にも色んな方法があるものだね。勉強になったありがとう。
551デフォルトの名無しさん (ワッチョイ 0b7c-qp9g)
垢版 |
2019/11/01(金) 16:54:14.94ID:BenAXzvv0
こちらのページ(https://www.sejuku.net/blog/99122)に記載されている
PDFをテキスト抽出してエクセルに貼るマクロを利用したいのですが、
ファイルとフォルダのパスを固定した記述になっているため、
ベースとなるPDFファイルを選択できるようにしたいのですがどなたか教えていただけないでしょうか。
↓のアスタリスク部分をどうにかすればと2時間戦いましたがどうにもできませんでした...

'PDFのデータをExcelに読み込むメイン処理
Sub Main()
'PDFファイルをテキストに変換するための定数を用意
* Const fileName = "*****"
* Const folderPath = "C:\Users\*****\"
Const pdfFilePath = folderPath & fileName & ".pdf"
Const txtFilePath = folderPath & fileName & ".txt"
'PDFファイルをテキストに変換
Call convPDFtoText(fileName, folderPath, pdfFilePath, txtFilePath)
'テキストデータをExcelに読み込む
Call importTxtData(txtFilePath)
End Sub
2019/11/01(金) 18:51:05.73ID:tcQFOgygr
>>551
GetOpenFilenameでパスとファイル名を取得
2019/11/01(金) 19:03:05.01ID:qpEsTrFRp
>>536
.Netのオブジェクトが使えるというのは
正直目からウロコだった。

いいね。.Net使いの俺からすると
機能に制限があるとは言っても有り難い。

ただ、参照設定して使っても
インテリセンスが効かないのが
ちょっと玉に瑕だけど。
2019/11/01(金) 19:13:41.95ID:VrCKg/E/0
>>532
試してないけど、クリック→ドロップボタンクリックにしたら発動しなくなったから、もうそれでいいやw
1クリックで2回動くのが嫌だけど。
いちいち、2回に1回Exitする処理入れないといけないし。
2019/11/01(金) 19:19:03.89ID:VrCKg/E/0
↑ダメだったwww
発動しないけど、何もしてないのに保存しますか?って聞いてくる現象が直ってないww
イベント関係ないのか。
2019/11/01(金) 19:19:33.63ID:uwtpA0hM0
>>553
IListインターフェースを通せばメンバが見れる
2019/11/01(金) 21:38:56.17ID:GexbRJ7D0
>>553
スニペット出す方法あるよ
2019/11/02(土) 10:38:29.89ID:Rmc9OzBRM
>>557
教えて
2019/11/02(土) 11:50:26.19ID:Wmiw+MGb0
>>552
定数を変数にしてファイル名だけの取得を別に作成したらできました!
ありがとうございました
560デフォルトの名無しさん (ラクペッ MMfb-KqWR)
垢版 |
2019/11/02(土) 17:21:27.20ID:ZDwGDXirM
>>557
CreateObjectせず使う方法があるのか
2019/11/02(土) 17:29:13.96ID:wtbfu1Hrd
ペニスット
2019/11/02(土) 17:58:11.63ID:71SUtLbe0
わかる
2019/11/02(土) 18:30:05.20ID:PiAf5Ioqa
VBAスレはみんな頭悪そうだなぁ
2019/11/02(土) 19:38:01.12ID:iaRIGfJY0
>>561
誰もが思うよな
2019/11/02(土) 19:39:08.44ID:FVhvHALx0
面白いこと考えるよな。
シートに貼ってソートか、SQLのORDER BYしか思いつかんかったわ。
2019/11/02(土) 23:15:53.80ID:yMKMWSCL0
>>563
見下したところでお前のほうが格上になったわけじゃないんだぜ
2019/11/02(土) 23:34:47.29ID:FVhvHALx0
ん?
>>563は、自分が頭良いとは言ってないのでは?
ここの回答者よりも高度な回答例は書けないようだし。
書けたら格上を認めてあげても良いけど。
2019/11/02(土) 23:38:18.19ID:neC/7x9UM
>>566
いちいち構うなよ…
2019/11/03(日) 00:02:25.36ID:uWoEfwnV0
おならが止まらん
2019/11/03(日) 04:16:21.62ID:C9sdk88g0
ユーザーフォームが表示されてる状態でキーボードのキーの組み合わせ(ctrl+何かとか)をした際にだけ、フォーム上に表示される様にするにはどう言ったコードにすればいいでしょう?
2019/11/03(日) 05:12:05.86ID:dj0payfvx
>>570
UserFormのKeyDownイベントで拾う
たとえばUserFormの上でCtrlキーとAキーが同時に押されたときにCommandButton1を表示するという処理なら下のようになる
押された文字キーを示すキーコードは引数KeyCodeに定数で格納されるけど、Aキー以外の文字キーにしたいなら定数は自分で調べてくれ
あと次からは何を表示したいのか目的語をきちんと書くように

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = 65 And Shift = vbCtrlMask Then Me.CommandButton1.Visible = True

End Sub
2019/11/03(日) 05:37:41.26ID:ZKxIvhRAM
Withってコーティングの手間を省く、見映え以外に良いこと有りますか?
2019/11/03(日) 06:42:19.84ID:RKQY4+qlM
>>572
Dim S As Xxx
Set S = Yyy
S.Abc = …
S.Def = …
より
With Yyy
.Abc = …
.Def = …
End With
の方が微妙に速いとかもあったかも
まあ気にするほどの差はない
2019/11/03(日) 08:20:53.85ID:C9sdk88g0
>>571
ありがとうございます。
今までユーザーフォームって苦手でほとんど使った事なかったのですが、今携わってるシステムは使ったほうが使い勝手良くなるので…
2019/11/03(日) 09:38:51.22ID:459Gcksu0
まず変数名を考えなくて良いという点、
それから、end with で破棄(解放)される点
2019/11/03(日) 13:54:04.03ID:dj0payfvx
逆にWithステートメントで取得した参照がEnd Withまで静的に保持される点は注意すべきポイントでもある

例えばWith ActiveSheet で始まるWithブロック内で他シートをアクティブにしても、ドットでアクセス提供されるメンバの親はWith宣言時点のActiveSheetになるからな
577デフォルトの名無しさん (ドコグロ MM02-l9Pq)
垢版 |
2019/11/04(月) 01:41:27.33ID:uMNIwQlPM
Withの読み方はウイズだと思うけど書くときの頭の中はいつもウイテンなのは俺だけなのかな
2019/11/04(月) 02:38:13.83ID:C7VrCGoL0
読み方があってるかどうか不安なのはあるな。
ナンバーフォーマットローカルとか。
2019/11/04(月) 02:46:05.97ID:Y6Gluo6PM
バリアントであってる?w
2019/11/04(月) 03:13:21.06ID:C7VrCGoL0
最初は、ヤッホージャパンって何だよwwwって思ったな。
2019/11/04(月) 03:53:28.93ID:CYpqTCzkx
むかしFalseのことファルスって読んでた
ファルスがギリシャ語で陰部を意味する単語だと知ったのは最近
2019/11/04(月) 09:39:04.15ID:gB0LOFjS0
滅びの呪文
2019/11/04(月) 14:50:42.78ID:O9lg7NQ30
w
584デフォルトの名無しさん (ワイーワ2 FF82-Se/k)
垢版 |
2019/11/05(火) 18:34:38.01ID:CrKvYzfVF
DataObjectオブジェクトについて https://chiebukuro.yahoo.co.jp/

0OM
585デフォルトの名無しさん (ラクペッ MMfb-KqWR)
垢版 |
2019/11/05(火) 18:44:36.75ID:v4Zm9Tj+M
>>581
20年以上ファルスと読んでた。最近Youtubeでフォルスだと知った。Bluetoothを何度教えてもブルースと読む同僚を笑えない。
2019/11/05(火) 18:50:10.04ID:W9mxYkl/d
>>585
ワイの周りにもファルス詠みはたくさんいる。中高の英語の勉強で発音記号見たことあるはずなのに
2019/11/05(火) 19:54:14.94ID:zWfG7OZu0
教えてくれた先生がファルスだったので周りもみんなファルス読み
2019/11/05(火) 20:22:41.01ID:JryaN2pta
上司からフォルスで教わった
589デフォルトの名無しさん (ワッチョイ 6f5f-ANgw)
垢版 |
2019/11/05(火) 21:16:39.16ID:rpaa5EWu0
フォルス?フォールスだろ?
英語知らんのかな
2019/11/05(火) 21:29:26.89ID:hUdA7EQo0
ファーストフードがいつの間にかファストフードになってるようなもんだろ
591デフォルトの名無しさん (ワッチョイ 6f5f-ANgw)
垢版 |
2019/11/05(火) 21:32:19.18ID:rpaa5EWu0
いや単にバカなだけだろw
2019/11/05(火) 22:00:02.40ID:Y2zra18+0
>>589
発音記号みると、どっちもあるみたいだね。
2019/11/05(火) 22:35:00.66ID:ah8KxcV+0
カタカナに当てはめるんじゃないfalseはfalseだぜ
2019/11/05(火) 22:50:55.14ID:yUheLICMa
ファォッルスッ!
2019/11/05(火) 22:52:22.61ID:ah8KxcV+0
ふぁっぁく!
2019/11/05(火) 23:47:59.23ID:7oZHxMow0
野球のファールみたいなもんだろ
よってファールスで
597デフォルトの名無しさん (ワッチョイ de61-DOEl)
垢版 |
2019/11/06(水) 06:04:23.35ID:jiZZUv+M0
LCase 関数 VBA http://vba-auto.com/lcase_function_vba/

B5F
598デフォルトの名無しさん (ワッチョイ de61-DOEl)
垢版 |
2019/11/06(水) 06:44:01.06ID:jiZZUv+M0
CBool 関数 VBA http://vba-auto.com/cbool_function_vba/

TDL
2019/11/06(水) 19:00:52.62ID:XsHQlDv60
ん?
ムサンバニかモーサンバーニーかっていう話?
2019/11/06(水) 19:53:02.84ID:3KrvKGm6a
ピッツァのことか
601デフォルトの名無しさん (オッペケ Sr0f-I9Tk)
垢版 |
2019/11/07(木) 00:18:34.56ID:Vgod5FHRr
すみません。
最新のWindows10でVBAを実行したところ、VBScript.RegExpのCreateObjectに失敗しました。
IEのVBS機能が無効化された影響によるものでしょうか?
回避策等ありますでしょうか?
2019/11/07(木) 03:57:12.24ID:sFRacxbxx
>>601
試してないけどJScriptを使ったらどうかな
32bit環境ならScriptControl オブジェクトをCreateObjectで生成してJScriptの正規表現を使う
62bit環境ならMSHTMLオブジェクトでIEのエンジンのJScript実行環境を生成して、そこからJScriptの正規表現を使う
2019/11/07(木) 19:03:46.63ID:JqbJgiKT0
同じフォルダ内の他のファイルを削除しようとすると
ファイルは削除されますが、
「実行時エラー'70': 書き込みできません。」
がでて処理が止まります。
Dim aa As String
aa = ThisWorkbook.Path & "\"
Kill aa & "*.*"

どうすれば止まらずに処理できますか
604デフォルトの名無しさん (ワッチョイ 0f8e-8UzB)
垢版 |
2019/11/07(木) 19:14:00.49ID:JuEkRQF70
>>603
自分の手で自分の頸を吊ってみればわかるぞ
2019/11/07(木) 19:14:43.23ID:A6k0oUZwx
>>603
ThisworkbookそのものをKillしようとして失敗してる
2019/11/07(木) 19:37:17.46ID:JqbJgiKT0
>>605
VBAの実行ファイルを対象から外すにはどうすればよいですか?
2019/11/07(木) 19:51:15.23ID:DHbfNndS0
>>606
ひとつずつ確認しながら消す
2019/11/07(木) 19:54:49.91ID:Hld4e4lOa
エラー処理いれる
2019/11/07(木) 19:56:45.33ID:5uk1oCuaM
>>603
On Error Resume Next
じゃダメなん?
2019/11/07(木) 19:57:11.59ID:JqbJgiKT0
>>608
ありがとうございます
611デフォルトの名無しさん (ワッチョイ 0f8e-8UzB)
垢版 |
2019/11/07(木) 20:19:39.30ID:JuEkRQF70
>>610
馬鹿は死ねよ
2019/11/07(木) 20:29:48.40ID:Hld4e4lOa
>>610
607のやり方がいいと思うぞ
2019/11/07(木) 20:32:08.30ID:DHbfNndS0
>>609
thisworkbookを消そうとした時以外でも同じエラーが出ることがある
2019/11/07(木) 20:46:34.17ID:gQ6uYn6M0
例外前提の分岐とか一番やっちゃいけないだろ
2019/11/08(金) 03:21:06.91ID:ebkgjtQt0
kill *.* とか普通は怖くてできないぞ
2019/11/08(金) 03:24:31.82ID:TcyEUh9gx
FileSystemObjectとか使えばいいのに
2019/11/08(金) 07:35:20.51ID:/14Ittk50
https://gigazine.net/amp/20191107-drum-machine-in-excel
スーパーテクを俺に継承してくれw
2019/11/09(土) 08:05:58.77ID:FLPipJw+x
>>603
Dim fso As Object
Dim fr As Object
Dim fl As Object

Set fso = CreateObject("Scripting.FileSystemObject")
Set fr = fso.GetFolder(ThisWorkbook.Path)

On Error Resume Next

For Each fl In fr.Files
If fl.Name <> ThisWorkbook.Name Then
fl.Delete
If Err.Number <> 0 Then
Debug.Print "Err.Number:" & Err.Number &" FileName:" & fl.Name
Err.Clear
End If
End If
Next fl
2019/11/09(土) 09:04:21.85ID:DhErEMKcM
Dim wb as Workbook
...

wbが開いているか閉じられているか確認する方法ありますか?
2019/11/09(土) 09:50:21.72ID:s5KKViGX0
For Each wb in workbooks で名前やパスをチェックするとか
2019/11/09(土) 10:39:45.65ID:YT93jrBPx
>>620
そのやり方だとNASとかにある共有ファイルを他人が開いてる場合には判定不可能

>>619
対象のファイルをエクセルファイルとして開かずにVB6のOpen ステートメントの追記モードで開くのがオーソドックスなやり方
他のユーザーエンティティが編集権をロックした状態だとファイルが開けずエラーが発生することを利用する
エラーコードを調べて0より大きい場合はファイルが開かれている、そうでなければファイルが開かれていないと判断する
ただし負荷対策が最適化されていないネットワーク環境でサーバーの応答が遅くなっている場合、数分前に誰かが閉じたファイルを開いていると判定してしまうので要注意

'サンプルコード
Sub Sample()
If IsFileOpened("任意のブックのフルパス") Then
MsgBox "開かれています"
Else
MsgBox "開かれていません"
End If
End Sub

Function IsFileOpened(fliepath as String) As Boolean
On Error Resume Next
Open filepath For Append As #1
Close #1
If Err.Number > 0 Then
IsFileOpened = True
Err.Clear
Else
IsFileOpened = False
End If
End Function
622デフォルトの名無しさん (オッペケ Sr0f-I9Tk)
垢版 |
2019/11/10(日) 03:17:05.03ID:7c8MD0U8r
>>621
ブックを開いているときは~$ファイル名の隠しファイルが作られるからそれを見たら
2019/11/10(日) 16:07:54.61ID:mlZHtGvXd
行番号が1-9まで1ずつ加算されてる中で3ごとにブロックとして処理の始点を1,4,7行にしたいんだけど行番号から式で求められないかな?
for i=1to9
if i<4 and i>0 then 処理1
elseif i<7 and i>3then 処理2
else 処理3
next i
これを分岐なしでスマートに書きたい
123456789→111444777って変換式が欲しい
624デフォルトの名無しさん (ワッチョイ 0f8e-8UzB)
垢版 |
2019/11/10(日) 16:20:12.48ID:ISabdlL+0
>>623
馬鹿は小学生からやり直せ
2019/11/10(日) 16:45:02.84ID:3pDgk0W90
1引いて3で割った商を3倍して1を足すとか
626デフォルトの名無しさん (スップ Sdbf-IAD9)
垢版 |
2019/11/10(日) 16:54:56.61ID:CxUi7EKzd
VBAの時点でスマートじゃないから
2019/11/10(日) 17:03:38.70ID:ER+z1tbi0
Ruby で、

( 1..9 ).each { |i| p ( ( i - 1 ) / 3 ) * 3 + 1 }
2019/11/10(日) 17:13:45.05ID:HO+Z4H690
何でもうすぐ無くなる言語のruby何かで答えるの?アホなの?
2019/11/10(日) 17:46:44.80ID:f9aUABsd0
>>623
変換するだけなら
i - (i - 1) Mod 3
で111444777になる
3つの処理に分けたいなら
Select Case i
  Case 1, 2, 3
    処理1
  Case 4, 5, 6
    処理2
  Case Else
    処理3
End Select
2019/11/10(日) 17:48:13.51ID:3pDgk0W90
式を入れてもできそうだな
2019/11/10(日) 17:55:48.55ID:CHmVk7q0x
>>623
111777999を割り出す変換式を使うのではなく、行番号を3で割った商が1の場合だけ処理を行うようにするのは駄目なの?
例えばこんな感じ

For i = 1 To 9
If i Mod 3 = 1 Then
'処理
End If
Next
2019/11/10(日) 18:00:46.35ID:CHmVk7q0x
>>631
間違えた、3で割った商じゃなくて余りね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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