VBAなんでも質問スレ Part2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2015/05/21(木) 10:52:44.71ID:KLv0vQmm
VBAを使った質問ならなんでもござれ
本来の対象であるオフィスアプリを操作する以外の話もOK

ゲーム作り、Webアクセス、外部アプリの操作
COM(ActiveX)、Win32API、.NET Framework、DirectXなどなど
VBAで実行するものであればなんでも質問してください

VBAを開発環境としていろいろ作っちゃいましょう

前スレ

VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/

関連スレ

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/

Access VBA 質問スレ Part1
http://peace.2ch.net/test/read.cgi/tech/1328536426/

VBプログラマ質問スレ(Ver.6.0 まで) part64
http://peace.2ch.net/test/read.cgi/tech/1393069842/

Excel総合相談所 118 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/bsoft/1430352555/
0619デフォルトの名無しさん
垢版 |
2018/10/12(金) 12:28:42.41ID:YStpcFYj
>>616
本当に?
ワークシートからDLL関数をCallするためのインターフェースだけはVBAネイティブのFunctionとして書かなきゃいけないと思ってた
ワークシートから直接C#ソースの関数をCall出来るってこと?

>>615
SubもCall出来る
というかSubは本来Subroutineのことを指すのでそもそもCallできなきゃおかしい
0621デフォルトの名無しさん
垢版 |
2018/10/12(金) 17:15:46.40ID:QO2uhWCP
VBAしか使わない人間は、WinAPI使わない人間はSubしかCallしない。
0626デフォルトの名無しさん
垢版 |
2018/10/12(金) 18:20:18.57ID:4bQjrfTH
ほんとに?MSのサイトに対処方法が書いてあったけどなあ。
仕事で使ってたmdbでエラー出まくってSubをFunctionに書き換えた記憶があるけどなあ
0627デフォルトの名無しさん
垢版 |
2018/10/12(金) 18:45:46.09ID:S2JrLclJ
意味が分からん。
ExcelだろうがAccessだろうが当たり前にできる。
やり方間違えてるだけだろ。

lngRet = FuncA("何かの引数")
Call SubA("何かの引数", "何かの引数2")
これはできる。

SubでCallを省いた場合に
SubA("何かの引数1", "何かの引数2")
とするのは出来ない。

Callを省く場合は
SubA "何かの引数1", "何かの引数2"
とする。
0628デフォルトの名無しさん
垢版 |
2018/10/12(金) 19:05:34.79ID:TjU2aakC
>>627
AccessとExceの用語の違いが問題かもしれません。
Accessだとマクロのデザインビューで新しいアクションの実行→プロシジャーの実行を選択→プロシジャー名を指定という流れです。
ここでSubを入れるとエラーになり、Functionを入れると実行されます。
全く同じ動作でもSubだとエラーでFunctionだと実行されるという謎仕様のことです。
0630デフォルトの名無しさん
垢版 |
2018/10/12(金) 19:39:49.69ID:wk7eAlWy
>>628
Accessマクロの「プロシージャの実行」機能は、Functionプロシージャに限ってアプリ経由でコールバックさせることができるっていう一種のリフレクション機能だから、仕様上Subプロシージャを呼べないのは当たり前

でも普通はVBAその他一般のプログラミング言語の話題でCallするとかコードを呼び出すとか言う場合、プログラムのコード中で他のプロシージャ(=メソッド)を呼び出すこと一般を指す
AccessだろうがCallステートメントでSubを呼べないわけがない

全然話してる内容が違う
0631デフォルトの名無しさん
垢版 |
2018/10/12(金) 19:42:56.49ID:4ERZBcjn
MSの提示する対処方法
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/runcode-macro-actionから抜粋
>>[!ヒント] Visual Basic で記述した Sub プロシージャまたはイベント プロシージャを実行するには、Sub プロシージャまたはイベント プロシージャを呼び出す Function プロシージャを作成します。
>>その後、 RunCode アクションを使用して、Function プロシージャを実行します。
0632デフォルトの名無しさん
垢版 |
2018/10/12(金) 19:47:22.51ID:4ERZBcjn
>>630
そうなんですか?Callという言葉の使い方が悪かったのですね。
Accessのマクロのプロシジャーの実行からSubを実行できないという表現が適切なんですね。
それにしても謎仕様ですね。いちいちCall_SubみたいなFunctionを作らないといけないなんて馬鹿らしいですよね。
Subを使うのを止めて戻り値を使わないのになんでもかんでもFunctionにしている人がいるのはこのあたりにも原因があるのでしょうかね。。。
0633デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:06:27.08ID:a+EZTAPW
C#やJavaなどの言語にはfunction相当の構文しか存在しないから、それに合わせてるだけかも
0634デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:12:42.89ID:Vm21lImY
サブルーチンというものは、マクロ上での繰り返し処理や重複処理が必要な場合に同じコードを何度も記載することを回避して、プログラムの再利用性と簡潔性とメンテナンス性を高めるためのもので一種の共通部品で呼び出して使えるためとても便利。
その代わり呼び出し側のコードが必ず必要。
0636デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:43:31.86ID:xhA4Quty
たとえ1回しか使わなくても、機能ごとに分けて名前を付けることでコードの見通しを良くするという目的もある
0638デフォルトの名無しさん
垢版 |
2018/10/12(金) 23:40:27.93ID:kwtsHVW5
・Accessのマクロの「プロシージャの実行」機能は要するに「関数を実行する」ことに重きを置いている機能なので、関数ではないSubプロシージャは呼び出せない。
・「呼び出す」と「Callする」は意味が(あるいは受け取り方が)違うので下手に知ったかぶりしないこと。
0640デフォルトの名無しさん
垢版 |
2018/10/13(土) 14:18:57.90ID:7+viDhhJ
>>638
関数という言葉の定義次第ではSub Procedureも関数の一種になるぞ

あと、Accessマクロの実行機能に関する話題でマクロピッカーからプロシージャを直接選択して実行する操作を指して「呼び出す」とか「Callする」と表現する例は比較的稀だと思うぞ
0641デフォルトの名無しさん
垢版 |
2018/10/13(土) 18:29:35.77ID:hGe/e45K
数学的な定義だと関数は一対一の写像だから戻り値がないものは関数ではなくなってしまう
丸投げアウトソーシングとでも言えばいいのか
0642デフォルトの名無しさん
垢版 |
2018/10/14(日) 01:16:47.10ID:FNEdXER5
>>641
その理屈だと、Function Procedureが戻り値なしの記述を許容していること、戻り値と全く論理的な二項関係がない処理をFunction Procedureの中に書けてしまうことを考えた場合、Function Procedureが果たして関数と言えるのかどうかということの方が怪しくなる
0643デフォルトの名無しさん
垢版 |
2018/10/14(日) 18:45:30.05ID:+nd0Ta/b
それはプロパティとメソッドについても言えるわけで。
意味合いから使い分ければ良い。

Accessの仕事してるけどいわゆるAccessのマクロ機能は嫌いなので殆ど触ったことないな。
0644デフォルトの名無しさん
垢版 |
2018/10/15(月) 00:09:25.20ID:bvVmxQGC
>>640
マクロからVBAプロシジャを実行するのを、呼び出すと言うのはすごく一般的だとおもうが
むしろ呼び出す以外にどう言うんだ

>>642
戻り値を指定しないFunctionだって戻り値はちゃんとあるんだが
まあそもそもプログラミング上でいう関数は数学的定義の関数ではないんだがな

>>643
一般的なプログラム用語としてはそうかもしれんが
VBAや旧VB,VB.NET,C#なんかはプロパティはメソッドとは別な構文で定義されてる
VBAの話するならちゃんと区別しれ
0645デフォルトの名無しさん
垢版 |
2018/11/14(水) 18:28:17.85ID:yWBiOXbZ
vba初心者でわからないところがあって質問したいんですけど、ここで大丈夫ですか?
0648デフォルトの名無しさん
垢版 |
2018/11/14(水) 19:27:08.71ID:yRk1YRk6
>>647
その宿題をやるには「フォームの作成」という作業が必要で、それは文章だけの掲示板じゃとても説明できない
0654デフォルトの名無しさん
垢版 |
2018/11/15(木) 12:24:37.27ID:yIPB3Fsn
なきゃ学校にあるPC使うだけやんけ
変な事気にする奴やな
0656デフォルトの名無しさん
垢版 |
2018/11/15(木) 23:21:50.05ID:XqpfGkJo
VBAで3つ数値があった時、最大値を表示させたい時
下記URLのNo.4の回答のelseifを使ったものがありますが、
elseifを使わずにelseだけで表示しようとすると、
どのようになるのでしょうか?
宜しくお願いします

ttps://oshiete.goo.ne.jp/qa/5352661.html
0657デフォルトの名無しさん
垢版 |
2018/11/15(木) 23:28:15.36ID:XqpfGkJo
分かりづらそうなので追記で、下記のところです。
宜しくお願いします 
  a = 10
  b = 200
  c = 30

  Max = a

  If b > Max Then
    Max = b
  ElseIf c > Max Then
    Max = c
  End If
0660デフォルトの名無しさん
垢版 |
2018/11/16(金) 06:57:12.53ID:fQoG7lNZ
そもそも657では最大値求められないだろ。
なぜ他の2つと比較してから決めないのか
0661デフォルトの名無しさん
垢版 |
2018/11/16(金) 07:24:20.18ID:biDBAQdb
すいません、まだ初心者でまだ理解が追いついていなくて
とりあえず最大値求めるにはこういう形...とかで覚えようとしてて....頑張ります
0662デフォルトの名無しさん
垢版 |
2018/11/16(金) 07:30:47.41ID:1oL4uemZ
658でも最大値は求められない
試しに
a = 1
b = 2
c = 3
で試してみるといい。Maxが2になってしまう

Ifだけでやる場合の正解の一例
Max = a
If b > Max Then Max = b
If c > Max Then Max = c
0663デフォルトの名無しさん
垢版 |
2018/11/16(金) 07:35:16.96ID:1oL4uemZ
>>661
If Elseの構文は、最初のIfの条件が成立したらElse以降は処理されずEnd Ifまで飛ばされる
つまり、
a = 1
b = 2
c = 3
だった場合、
b > Maxが成立したらc > Maxの部分は飛ばされてしまうからMaxは2のまま終わってしまう
0664デフォルトの名無しさん
垢版 |
2018/11/16(金) 07:44:30.26ID:fQoG7lNZ
elseやelseifは先行条件でTrueにならない場合にしか実施されない仕組みなことを理解しましょう
0666デフォルトの名無しさん
垢版 |
2018/11/16(金) 09:26:27.62ID:RKO+v0zL
ID変ったかも知れませんが>>656です
皆さんありがとうございます

>>665
手痛いレスですが、出来るところまで頑張ろうと思います。プログラマーではないですが基本は覚えないと連携し辛い位置の役職のため頑張ります。
0667デフォルトの名無しさん
垢版 |
2018/11/16(金) 09:39:56.01ID:fQoG7lNZ
本当のプログラミング初学者なら仕方ない。制御構文なんてどの言語も似てるので、1つ覚えれば次は勘が効くようになるよ、長い目でがんばりなされ
0671デフォルトの名無しさん
垢版 |
2018/12/16(日) 00:58:32.35ID:SwJ6GlUb
>>668
わにわに
0672デフォルトの名無しさん
垢版 |
2018/12/16(日) 01:01:16.65ID:SwJ6GlUb
パニックを、5人がかりでやれば楽勝だろ、とか言ってるようなもの。
0675デフォルトの名無しさん
垢版 |
2018/12/26(水) 21:53:30.63ID:KrpjpPkw
VBA初心者です。少し長くなってしまいますが質問です。
・やりたいこと
1:現マクロ有効ブックのsheet1にフォームボタン設置する。
2:押すとC:\Users\Public\動物まとめ.xlsx をバックグラウンドで開き、その中のシート名"カピバラ情報"の E列4行目から5行目6行目...と、空白が来るまでの情報を取得しする。
3:現マクロ有効ブックに新しくsheet2を作り、その新シートのA1からA2A3...に取得した情報を書き込む。

現在のマクロは下記ですが上手くいかないです。
Option Explicit
Sub practice()
Dim i As Long
    i = 4
Dim fullPass As String
'セルのB3に C:\Users\Public\動物まとめ.xlsxと記述
fullPass = Range("B3")

Dim wb As Workbook
Dim Anothersheet As Worksheet

Workbooks.Open fullPass
Set Anothersheet = wb.Worksheets("カピバラ情報")
Sheets.Add After:=ActiveSheet
Range("A1").Select

Do While Cells(5, i).Value <> ""
 i = i + 1
Loop
Call wb.Close
End Sub

上手く情報を取得できないのでアドバイスお願いします。
0676デフォルトの名無しさん
垢版 |
2018/12/27(木) 00:53:04.14ID:coxr7jtk
>>675
wbに何も代入されてない。
AnotherSheetへの代入もこけるはず。
AnotherSheetが正しく生成されたとしても、その後使用されていないから何かとってこれるはずがない。
0678デフォルトの名無しさん
垢版 |
2018/12/27(木) 01:02:39.75ID:coxr7jtk
>>675
行列指定が逆?
5行目を右方向に評価してくような感じになってるけど、新規に作ったシートが対象になってるから、一周もループしてないよね?
0680デフォルトの名無しさん
垢版 |
2018/12/27(木) 01:16:51.54ID:coxr7jtk
>>675
バックで開いたつもりのブックに新規シート作っちゃってない?
ブックのフォーカスを制御するとか必要かも。
0681デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:18:35.23ID:psUgzr4+
ID変わりましたが>>675です。

>>676>>680
遅い時間帯でありながら見てくださって
ありがとうございます。

色々と不十分だったのですね。
指摘箇所を直したりして
また報告しようと思います。
0682デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:19:34.30ID:lhYnw8ev
>>675
最初に注意すべきなのは、いきなりRangeやCellsは絶対に使うべきじゃないってこと。
ちゃんと省略せずにWorkbookやWorksheetから書くようにする。
しかしそれだとコ―ドが長くなるのでそのために今回のコードのように変数で受けるかWith文を使う。

以下はスマホ上で書いてるんで動くかは不明です。
0683デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:20:24.73ID:lhYnw8ev
Option Explicit
Sub practice()
Dim i As Long
Dim fullPath As String
Dim wb As Workbook
'Anothersheetじゃ分かりにくいんでopnShtに変更。
Dim opnSht As Worksheet
'追加シートは変数に受けないの?
Dim addSht As Worksheet

'セルのB3てどこ?
'多分ボタンのあるシートかなと推測。
fullPass = Thisworkbook.Worksheets("Sheet1").Range("B3").Value

'B3に出鱈目書いて動かしたらどうなるんだろう?
Set wb = Workbooks.Open(fullPath)
Set opnSht = wb.Worksheets("カピバラ情報")
With Thisworkbook
Set addSht = .WorkSheets.Add( After:=.WorkSheets("Sheet1"))
End With

'Range("A1").Selectって何の為に有るの?

'iの初期値を一番最初に書いてたけど、初めて見たとき何だか分からんかった。
'使う直前に関連処理と一緒にまとめた方が分かり易いよね。
i=4
Do While opnSht.Cells(5, i).Value <> ""
 i = i + 1
Loop
'元のCall wb.Closeなどという書き方をしたことが無いのでいつもの自分の書き方に変更。
wb.Close False
End Sub
0684デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:22:53.65ID:lhYnw8ev
>>680
フォーカスを制御すべきじゃない。
いきなりRangeやCellsを使うから上手くいかないのであって、きちんとブックやシートから書けばフォーカスを制御しなければならないことは滅多に無い。
0685デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:26:03.58ID:lhYnw8ev
早速間違いだ。
fullPassと書いてる所が一ヶ所ある。
fullPathに直しておいてね。
0687デフォルトの名無しさん
垢版 |
2018/12/27(木) 11:57:21.88ID:psUgzr4+
>>682‐685
ありがとうございます
深夜のご指摘から>>685まで参考にしていて

現在デバッグしてますが、“カピバラ種類”のシートが上手く取得できていないようです。
ちなみに
'セルのB3てどこ?
'多分ボタンのあるシートかなと推測。
その通りです、分かりづらくてすいません。

改行制限のためいくつかコメントは掲示板に書き込むとき省いてしまいました。

'Range("A1").Selectって何の為に有るの?
ですが 、新シートのA1から書き込む為に書きましたが、デフォルトでA1から書き込むみたいですので
無駄なマクロでしたね。
0688デフォルトの名無しさん
垢版 |
2018/12/27(木) 12:23:02.37ID:psUgzr4+
少し言葉足らずでした。
iのカウント(空白行までループ)は上手く出来ているので、現マクロ有効ブックの新シートに取得情報を
書き込めていないようです。
0689デフォルトの名無しさん
垢版 |
2018/12/27(木) 12:57:12.54ID:lhYnw8ev
>>688
うん?
Do〜Loopの中はiのカウントアップしてるだけなので、あなたが省略した(と勝手に思ってるんだけど)コードが動いていないということ?

念のためにいうと、元々のコードには情報を取得するコードが全く無いからこのコードだけじゃ取り込めないのは当たり前だよね。
0690デフォルトの名無しさん
垢版 |
2018/12/27(木) 13:47:48.84ID:psUgzr4+
すいません、
不覚に気づき、
dim j as long
j = 1
を追加し、ループを
Do While opnSht.Cells(5, i).Value <> ""
addSht.cells(j,1) = opnSht.Cells(i, 5)
j = i
 i = i + 1
Loop
にして上手くいきました、ありがとうございます。
0691デフォルトの名無しさん
垢版 |
2018/12/27(木) 13:57:20.08ID:psUgzr4+
細かい修正として
j = i
i = i + 1
の部分も
i = i + 1
j = i - ○
のようにして、
無駄にできてしまう空白もなくしました。

お付き合いしてくださった方、
ありがとうございました。
0692デフォルトの名無しさん
垢版 |
2019/01/03(木) 04:15:42.29ID:aAVkqECP
質問です
ワークシート上にすでに引かれている複雑な枠線をコードとしてどうにか変換というか取得できる方法はないでしょうか…
0694デフォルトの名無しさん
垢版 |
2019/01/03(木) 13:29:44.69ID:aAVkqECP
>>693
返事ありがとうございます
すみません、私の頭では理解できません…よかったらもう少し詳しく教えてもらえませんか
0696デフォルトの名無しさん
垢版 |
2019/01/03(木) 15:15:01.64ID:Em9anKIf
>>694
罫線を描く動作は理解できてる?
マクロ記録で簡単に調べられますよ。
例えば、2行2列選んで、縦横斜め全てに実線入れて
記録されたものを見ればどのような構造で描かれているのか
分かります。
記録の際は、xl〜の定数でよいですが、取得の際は数値で
返ってくるので注意。
調べたければオブジェクトブラウザで調べてもよいですが、
イミディエイトで、?xlThin みたいに簡単に確認する方法も
あります。
でも、取得して使うなら数値のままでもOKです。
ここまではOK?
0697デフォルトの名無しさん
垢版 |
2019/01/03(木) 16:26:50.99ID:+aY40et6
>>695
>>696
会社でとある先人の作ったエクセルのフォーマットがあるのですが、それを使って作業するおばあちゃんが度々壊してしまうのです
セル結合やセルの幅など複雑になっている物なので、壊してしまったパソコンの不得意なおばあちゃんはいつも四苦八苦していて、どうにか入力された数値以外の罫線や列幅などだけボタン1つ簡単に戻せるものを作ってあげたいと考えています

頂いたヒントを元にもう少し頑張ってみます
結局わからなければまた質問させてください
ありがとうございました
0698デフォルトの名無しさん
垢版 |
2019/01/03(木) 16:38:04.35ID:CdG5H8Qg
>>697
シートの保護じゃダメなの?
おばあちゃんには特定セルに数値入力させてるだけなんでしょ?
0699デフォルトの名無しさん
垢版 |
2019/01/03(木) 17:30:36.94ID:Em9anKIf
>>697
シート保護で十分みたいですね。
もし何らかの理由で保護できないのであれば、
同フォーマットの隠しシートから書式貼り付けした方が早そう。
セル結合もあるし、1セルずつ罫線情報取得とか効率悪すぎ。
0700デフォルトの名無しさん
垢版 |
2019/01/03(木) 22:01:21.27ID:aAVkqECP
>>698
>>699
それがわかりながらあらゆる所(不規則)を動かさないといけない時があったりで、保護だと都合が悪かったんです
フォーマット自体を大幅に変更できればもっと色々と簡単にできるのですが、それも他のおばあちゃんたちが前の方が良かった〜なんて必ず言うので見た目を崩すことはできません
担当のおばあちゃんorおばさんが変われば書式貼り付けのための範囲選択も上手くできないだろうから(全選択など知りません)また誰かが黙って長時間四苦八苦する事になってしまいます
無駄にすべて最初からやろうとしたりも平気であります
平均年齢49才の職場なので仕方ないんです
誰にも聞かずに戻したい部分を戻せるような、とーーってもわかりやすい説明付きのボタンをユーザーフォーム上にでもいくつか作ってあげたいと思っています
崩してしまうパターンはだいたい把握できているので、それが最善かなと…
0701デフォルトの名無しさん
垢版 |
2019/01/04(金) 02:06:01.37ID:+nkelZ7z
>>700
いや、だから隠しシートから自動的に書式修復をかければという意味で言うたのですが、、
トリガーはファイルオープンでも、ボタンでも。

試しにやってみたけど、罫線やセル結合は問題なく修復できるみたい。
入力規則とかは引き継げないみたいなので別にケアする必要があるかも。
行挿入、列挿入とかされて座標がかわるようなことされないならこれで十分では?

自分がよくやるのは、表のエリア毎に範囲名をつけて、そのエリア単位で最初に表組みした
ときと同じ要領で表作成を記録していき、コードを整理して修復マクロにします。
これなら起点となるセルが壊されなければ行挿入、列挿入にもある程度柔軟に対応
できるし、式や入力規則の修復も追加できる。
まぁ、利用者は作成者の想定を軽く超えてきますけどね。
0702デフォルトの名無しさん
垢版 |
2019/01/04(金) 08:59:12.57ID:jYRqvj54
>>701
理解力なくてすみません、、、
そしてありがとうございます
そのやり方を取り入れてとりあえず一度作ってみます!
0703デフォルトの名無しさん
垢版 |
2019/01/19(土) 20:28:43.04ID:gUifgf+0
ディム a アズ インテジャー
コンスト b アズ バリアント = ファルス

この読み方はあってますか?
0705デフォルトの名無しさん
垢版 |
2019/01/20(日) 08:43:51.62ID:KJwN8fo6
マジか!
自信なくなってきたわ。
フォー イーチ 〇 イン、スターコンブ、ブイビーナロウ、コンカット、
ナンバーフォーマットローカル、ドゥ ホワイル、イズナメリック、
デカー ファンクション セットウインドウロング リブ "ユーザー32" エリアス、
バイバル 〇 アズ ブーラン、アプリケーション.ハウンド、オプション エクスプリシト。
0714デフォルトの名無しさん
垢版 |
2019/01/31(木) 16:04:06.71ID:f4/Ws+Wz
パワポでExcelのVBAにある
Application.OnUndo
みたいなことって出来ない?
■ このスレッドは過去ログ倉庫に格納されています

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