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/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で割った商じゃなくて余りね
2019/11/10(日) 19:14:57.01ID:tOVYZh2e0
数独かな
2019/11/10(日) 19:46:34.21ID:3pDgk0W90
j = Mid("111444777", i, 1)
2019/11/10(日) 22:03:46.21ID:mlZHtGvXd
たくさんレスありがとう
>>634のが一番シンプルな気がするのでこれいただきます。

>>633
そのとおり
練習で作ってみてるんだがエスパー力に驚嘆
2019/11/10(日) 22:35:02.94ID:bOxdjs7b0
for i =1 to 7 step 3
2019/11/11(月) 06:13:38.55ID:3IE5w81qd
( x - 1 ) mod stepNum + minNum
例えば0123456789を3ずつカウントアップすると000333666になる
2019/11/11(月) 06:30:01.29ID:Q8KRogaUa
>>637
何故馬鹿は聞かれてもいない事をこたえてしまえのかw
2019/11/11(月) 08:49:23.01ID:P0z5I7y60
>>635
1-9, 3毎, ブロック
こんだけあれば可能性として浮かぶよ
2019/11/11(月) 19:59:18.13ID:oGPuZ3IA0
>>637
>>625をやろうとしてる?
641デフォルトの名無しさん (ワッチョイ 4bc4-PySg)
垢版 |
2019/11/11(月) 21:20:23.51ID:ar1IlrsX0
ブックAのUserFormのボタンから1つ下のフォルダに入っているブックBのUserFormを起動させたいのだけど、
ネットで探した「Application.run Thisworkbook.path & "\〜\ブックB!subプロシージャ名"」というのを記載して実行させたけど、
エラーになってしまいましたが、これはどこが悪いのでしょう…
2019/11/11(月) 21:24:34.26ID:oGPuZ3IA0
>>641
パス、プロシージャ名、引数のどれかが間違ってる
2019/11/11(月) 21:26:03.11ID:oGPuZ3IA0
拡張子も付いてないな
2019/11/11(月) 21:56:10.05ID:ar1IlrsX0
>>643
.xlsm!〜でもやってみたのですがダメでした。
2019/11/11(月) 21:58:12.61ID:ar1IlrsX0
ちなみに、workbook_openのプロシージャは直接subプロシージャ名を指定してもブックが開く時には通るって考えでいいんですよね?
2019/11/11(月) 22:22:57.09ID:oGPuZ3IA0
>>644
パスを'で括る
2019/11/11(月) 22:26:38.25ID:m+wKVDU/0
>>640
たぶんそうじゃない?
2019/11/12(火) 02:24:55.99ID:oo4izA1E0
>>646
application.run 'thisworkbook.path & "ブックB.xlsm'!subプロシージャ"
って書けばいいのでしょうか?
2019/11/12(火) 04:29:40.38ID:0+gbLwkM0
>>648
先頭のシングルコーテーションは&演算子で結合する

application.run 'フルパス'!プロシージャ名
という形になるようにする
2019/11/12(火) 08:36:17.42ID:l0mUz5CNM
>>649
やってみます!
ありがとうございます。
2019/11/12(火) 08:50:10.74ID:l0mUz5CNM
>>649
シングルクォーテーションにしたら…コメントアウトになりません?
…今気がついたけど…
2019/11/12(火) 08:58:18.88ID:l0mUz5CNM
>>649
すみません、自分の早合点でした。
"'" &でやればシングルクォーテーション使えましたね…
2019/11/12(火) 10:11:19.95ID:n8VUgOjjM
スレチですまん。
俺はVBAをやってるが上司から言われました。(うちの部署、10名のうち、VBAを作れる人は二人だけ、、、)

AIが集計をしてくれるからEXCELは必要ない時代が来るねと言ってた。

反論出来る?
2019/11/12(火) 10:27:44.24ID:9Ebm7+hvM
楽しみですねと答える
2019/11/12(火) 10:28:50.68ID:l0mUz5CNM
まぁAIが台頭してくる頃にはその上司は居ないだろうからスルーでいいんじゃない?

それかそのAIの設定?は誰がやるんだよっ!
そんな事も分からん様なヤツの方が必要なくない?ってw
2019/11/12(火) 11:50:40.50ID:PU6pNSMVF
AI以前に、最近のDXの流れでシステムが合理化されていって、VBAでやってるような無意味な業務自体が消滅するのが先だろうね
2019/11/12(火) 13:09:11.37ID:YXMhvVfEa
AIってまたざっくりしてるなぁ
2019/11/12(火) 13:51:05.18ID:kiUdBOPaM
○データフロー中に存在する、辻褄合わせのためのデータ加工
→業務フローの見直し、システムの改善、ETLツールの導入等により脱VBA
○ルールベースで実施可能な、機械的な意思決定のためのレポート作成
→完全な自動化により脱VBA
○ルールベースでは困難な、人間的判断を必要とする意思決定のためのレポート作成
→BIツール等に置き換えて脱VBA
AIを使うとしたらこの3番目だけど、そこまでいく前にやるべきことはいくらでもある
それをやり尽くしてAIの導入を検討する頃にはVBAなんかとっくに無くなってるはずだから、VBAとAIが直接競合することなんて無いよ
659デフォルトの名無しさん (ワッチョイ 0f8e-8UzB)
垢版 |
2019/11/12(火) 14:15:36.08ID:fOVSc9po0
現在のAIが何をやってるか知らない馬鹿ども
2019/11/12(火) 19:55:22.11ID:CeIzlsxBr
VBAが必要ないじゃなくて、EXCELが必要なくなるだからな
人間が介在する限り、なんらかのUIは必要なわけで、AIとEXCELはまったく競合しないわな
2019/11/12(火) 21:10:30.98ID:6BPOxo4o0
昔のSFみたいに透明なパイプを空飛ぶ車が走ったりロボットが何でもやってくれる世界を想像しているようなもんだろ
残念ながら現実は違ったよな
662デフォルトの名無しさん (ササクッテロレ Sp0f-9pxj)
垢版 |
2019/11/12(火) 23:57:00.45ID:NVQBnRcZp
構文ミスって無限ループが発生した時にエクセルが固まるやつはなんか対策ないんか?
2019/11/13(水) 01:01:43.28ID:1iCOkal60
>>662
Esc連打したり他のウィンドウをアクティブにしたりを繰り返してみる
2019/11/13(水) 08:52:45.90ID:dBffRhEVM
VBAよりPythonを覚えた方がいいなぁ。
2019/11/13(水) 09:27:16.58ID:QPrlUzWZd
>>661
交通事故をなくすには車を隔離してパイプの中を走らせるのが一番
ただしあと300年かかる
2019/11/13(水) 09:50:15.66ID:zYuYteZMM
>>664
低学歴がPythonやっても仕事無いぞ
667デフォルトの名無しさん (ワッチョイ fb7c-t5zK)
垢版 |
2019/11/13(水) 11:30:26.61ID:0dM9Rqjm0
いつかはExcelもPCも必要なくなる時代は来るだろうけど今は必要だからな。データ管理する以上はExcel、Accessは最後まで残りそうだけどな。
将来的に事務職がなくなれば、事務管理してる上司もいらないから、新しい仕事探したほうがいいね
Pythonだけ出来ても仕事ないよ
2019/11/13(水) 12:06:34.79ID:gzl4+/xqM
faxすら無くせないのに
2019/11/13(水) 13:00:27.19ID:cKfGi7tYa
PC無くなるのはまだ随分先だろ
2019/11/13(水) 13:55:43.47ID:aJh4//42d
紙の書類を茶封筒で送る郵便すら生き残ってる
2019/11/13(水) 15:18:04.61ID:WJRWmFcXa
学校で奨励されたためにVBAエキスパートを受験しようと思いましたが、仮にスタンダードまで合格すれば理解度はどの程度にまで到達するのでしょうか?
2019/11/13(水) 15:26:24.21ID:zYuYteZMM
その時点で世の中の自称VBAプロの半数以上よりは上だと思う
世の中のVBA使いのレベルは想像を絶するほど低いから、
少しでも何が役に立つもの作れるようになったら「VBAを使いこなせます」と言っちゃっていいよ
2019/11/13(水) 16:25:53.60ID:WaSRdoWP0
エキスパート持ってるけどやっぱり試験用の知識って感じだよ
つまらん関数の引数とか
PC環境あれば簡単に確認できるものを暗記でやる感じ
2019/11/13(水) 19:26:09.82ID:YFdnwmN50
VBAエキスパートなんかあるのか・・。
VBエキスパートではなく。

トランスフォーマー検定じゃなくて、
トランスフォーマーガム検定みたいな感じか?
違うか。
2019/11/13(水) 19:34:50.53ID:8BkVy1q9F
求められるのはVBAエスパー
2019/11/13(水) 19:58:58.25ID:YIACCBmB0
A列で適当な色でフィルターをかけて、B列の可視セルをC列の値✕D列の値にする場合はどうすれば良いでしょうか。
for each in specialcells(xlCellTypeVisible)
b.value=c.value*d.value
next
にしていますが、データ2000くらいあるとと遅いです。
b.specialcells(xlCellTypeVisible).value=を用いれば早くなりそうですが、よく分かりません。
分かる方いましたら教えて下さい。
2019/11/13(水) 20:10:53.70ID:YFdnwmN50
何だそりゃww
可視セル以外は計算しちゃいけないのか?
計算してもいいなら、全部配列に入れて計算しちゃえば?
2019/11/13(水) 20:15:05.26ID:YIACCBmB0
>>677
早速の返信ありがとうございます。
可視セル以外は変更してはだめなんです。
後だしになるんですが、黒でフィルターしたらC✕D、白ならC-Dと処理が違うためです。
2019/11/13(水) 20:15:12.55ID:6AWs9S2tr
>>676
B列にはじめから計算式入れとけば良いんじゃ
2019/11/13(水) 20:23:26.06ID:1iCOkal60
>>678
フィルタいらなくない?
色で計算変えればいいだけじゃない?
681デフォルトの名無しさん (ササクッテロ Sp0f-jIeE)
垢版 |
2019/11/13(水) 21:12:54.98ID:xS2J4sOcp
質問失礼します。
vbaからc++のdllへ引数を渡してc++で処理し、配列をvba側に返したいです。
引数で渡すものは、配列ではありません。

文字列や数値をvbaで受け取ることは出来るのですが、配列はどのようにc++から受け取れば良いのでしょうか?

お願いします。
2019/11/13(水) 21:45:08.38ID:YIACCBmB0
>>679
>>680
ボタンを押した時だけ変更するようにしたいので、式を入れるのは難しいかと思います。
またまた後だしになるんですが、他にも色々ボタンを配置して、このボタンを押すとB=Cとしたり、こっちのボタンを押すとB=1.1*Dという感じにしています。
2019/11/13(水) 21:50:01.18ID:1iCOkal60
>>682
だからボタン押した時色によって計算変えればいいじゃないかと
2019/11/13(水) 22:20:19.63ID:nTBpuTY40
このスレって北海道のハゲのおっさん来てるの?
2019/11/14(木) 20:59:40.88ID:17R2nmHB0
>>682
色以外にフィルタをかけられる要素は無いの?
あるなら、一旦解除して配列に入れて、該当行だけ計算して、またセルに戻して再度フィルタ。

>>681
普通に受け取れると思うけど。
ByRef的に受け取るの?
2019/11/15(金) 05:48:17.81ID:yBQ3/wSNr
>>676
for eachループを
range(cells(2,2),cells(10000,2).end(xlup)).specialcells(略).formula="=C2*D2"
2019/11/15(金) 06:53:06.51ID:PYCwQdmA0
このスレって北海道のハゲのおっさん来てないの?
2019/11/15(金) 08:30:23.58ID:1eiULMc8H
>>687
こんなとこでハゲ友おっさんずラブっすかw
2019/11/15(金) 09:09:18.54ID:kdsqvzvNd
>>671
昔、某掲示板で質問してた奴が、欲張らずに基礎からやった方が良いと言われてエキスパート持ってるんですけどねと言ってた人がいた。
そんな感じかな。
2019/11/15(金) 09:16:55.98ID:QHXNBkQLM
vbaスタンダードの教材の目次見たけど基礎というか普通に初心者向けという感じがした
逆にこういう内容飛ばしてどうやって使ってるんだろう
2019/11/15(金) 18:37:41.87ID:C4049C6d0
基礎からやるの、良いと思うけどな。
基礎を無視した俺は、ADOもWinAPIもUiAutomationも使えるが、
プロシージャの意味を20年くらい知らなかったぞ。
2019/11/15(金) 18:58:40.00ID:PYCwQdmA0
スーパーつるっぱげ
2019/11/16(土) 13:07:26.06ID:sIw2xRM6a
VBAスレ民はマジで頭弱めだな
694微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:01:13.26ID:Owph/MuN0
「置換したい文字列」と「置換文字」を変数として扱って、全体の文字を出力することはできませんか?
Replace関数では、Replace(文字列, 検索文字, 置換文字)とありますが、
文字列の入った変数を第一引数に与えるエラーが出てしまいます。

最終的な目的として、エクセルで定型的なHTMLコードを出力したいのです。
何かよい策がありましたら教えてください。

Sub 企業情報コピーテスト()
Dim i As Long
Dim s1 As String
Dim excelldata1 As String
Dim excelldata2 As String
....
s1 = HtmlSorce.Cells(2, 2).Value
'企業名
excelldata1 = Sheet1.Cells(4, 4).Value
'資本金
excelldata2 = Sheet1.Cells(5, 4).Value
Replace(s1,"tabledata1", excelldata1)

Debug.Print (s1)
End Sub
695微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:02:05.70ID:Owph/MuN0
■HtmlSorce.Cells(2, 2)に入っているデータ■
<table width="100%" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>企業名</td>
<td>
tabledata1
</td>
</tr>
<tr>
<td>資本金</td>
<td>
tabledata2
</td>
</tr>
....
</tbody></table>

///////////////////////////////
こんな感じです。どうぞよろしくお願いいたします。
2019/11/16(土) 20:06:56.33ID:sGW0vpYA0
>>694
関数の結果を入れる変数が抜けてる
コートは精査してないけど、とりあえずこれでいいんじゃね?
s1 = Replace(s1, "tabledata1", excelldata1)
2019/11/16(土) 20:08:04.72ID:TSYRRFtw0
>>694
普通はエラー出ない
698微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:10:44.84ID:Owph/MuN0
すいません。できた 私はあほでした。
s1 = Replace(s1,"tabledata1", excelldata1)
で出力できました。
699微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:11:37.38ID:Owph/MuN0
みんな、早い。。ありがとう。。
2019/11/17(日) 03:29:18.67ID:2cbrHYYdx
レンダリングエンジンとしてExcelを使ってるの?
つらすぎるなそれは
2019/11/17(日) 04:16:20.60ID:ssaK56un0
レンダリングエンジンの意味間違ってるよ
2019/11/17(日) 06:32:04.83ID:xHzCYEPp0
使ってるかどうかは、これだけじゃ判断できない
可能性はあるけど断言はできないから
703微動 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 11:35:29.77ID:7JpkRiZ80
わたくしのことですか??

コーディングは、いつもAtom使って手打ちしてるよ。
ただ、定期的にエクセルで入稿してくる案件があるので、
毎回エクセルからデータを手作業でコピペするのがしんどくて
コピペミスもあるし。
VBAでまるっとタグが出力できればいいなと。

他に良い方法がみあたらないし、これがベストかと。

思ってるとこでし。
2019/11/17(日) 11:38:28.01ID:iKuebie5a
Atomとか久しぶりに聞いたな
VSCodeに完全敗北して利用者がほとんど乗り換えた挙げ句に開発元がMSに買収されて完全に開発も終わった死んだエディタだよ
705微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 11:47:05.51ID:7JpkRiZ80
そんなこといわなくても、、、
web系は、sublimetext か Atom が多いと思う。まれに秀丸さんもいるお。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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