Excel VBA 質問スレ Part61

■ このスレッドは過去ログ倉庫に格納されています
2019/04/25(木) 23:41:03.61ID:rni/4bMj0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part60
https://mevius.5ch.net/test/read.cgi/tech/1552736349/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/04/25(木) 23:47:29.76ID:TOmG9Zzp0
>>998
>おっさん、それじゃ値が二つできてしまう

出来て良いんだよ。
どうせ2つあっても上の値しか拾わないし。
2019/04/26(金) 00:13:53.35ID:bx/nrM53a
まだやってるのか
2019/04/26(金) 00:22:08.10ID:KXEc/Aen0
番兵の方を拾った場合は?
5デフォルトの名無しさん (ワッチョイ 8552-en87)
垢版 |
2019/04/26(金) 10:15:59.90ID:P7S61/Hq0
usedrange.columns.count は多用しますが
これを列番号ではなく
アルファベットで(AX列、というように)
取得することはできますか?
2019/04/26(金) 10:30:14.79ID:P7S61/Hq0
>>5
あ、addressメソッドがありました。
自己解決しました。
2019/04/26(金) 18:56:37.31ID:udZssoTkd
よっぽど自己矛盾について触れて欲しく無かったようだな。

>>973>>857はその後だと言ってるのに。
2019/04/26(金) 19:59:27.77ID:HeuAVqYr0
ネットワーク上のMDBファイルにADOで接続して取ってきたデータを帳票に表示→印刷というマクロを作りました
しかし1件なら問題ないものの、ループ実行すると正常終了で終わるのですが
実際に印刷すると2件目以降のデータが反映されず、全て1件目のデータが印字されます
どうもMDBから取ってくる部分のタイミングの問題に見える(その部分に差し掛かると画面が固まる。DoEventsを入れずに重い処理をさせたときの感じ)のですが、SleepやDoEventsを適宜挟んだり、印刷ではなく別ブックやpdfに書き出しなどに変更しても効果が見えません

この現象の解消方法をご存知の方いませんか?
2019/04/26(金) 20:55:16.93ID:/RLYU0hs0
>>7
まだやってるのかよ
悔しがりすぎww
2019/04/26(金) 22:32:55.22ID:dk67nCTl0
>>8
言ってることがよくわからんけど、adoで直結してデータとってきてるなら、doevents挟んでも意味ない
なので、そもそもバグってると思われる。

doeveが効果あるのは、間接的に(と言って伝わるかわからんけど)何か処理するとか表示を反映させるとかの場合
2019/04/27(土) 00:36:16.19ID:Oy0GcGsSM
>>8
俺も単なるプログラムミスだと思う
謎々シテナイデソース貼れよ
2019/04/27(土) 07:20:56.42ID:0MG9/7scr
movenextが無いとかループカウンタが加算されていないとか
2019/04/27(土) 09:50:04.14ID:xkuV+iFS0
ブレイクポイント置いたり、debug.print挟んだりするのは、
基本のキ
2019/04/27(土) 12:20:27.60ID:S53FxUuZ0
Sheet1, Sheet2, Sheet3 がある状態で
A1 =fnEnumSheetName() と入力すると
A1 シート名一覧
A2 Sheet1
A3 Sheet2
A4 Sheet3
と表示されるようにしたいのですが
A1に#VALUE!と表示されDebug.PrintがSheet1しか表示しません
期待通りにするにはどう修正すればいいですか?
For文3行目のコメントアウトを外すとDebug.PrintとA1の表示は期待通りです

'シート名列挙
Public Function fnEnumSheetName() As String

Dim iIndex As Integer

For iIndex = 1 To Worksheets.Count
Debug.Print Worksheets(iIndex).Name
' ActiveCell.Offset(iIndex, 0).Value = Worksheets(iIndex).Name
Next iIndex

fnEnumSheetName = "シート名一覧"

End Function
2019/04/27(土) 12:25:43.11ID:S53FxUuZ0
訂正です
× For文3行目のコメントアウトを外すとDebug.PrintとA1の表示は期待通りです
○ For文3行目をコメントアウトするとDebug.PrintとA1の表示は期待通りです
2019/04/27(土) 12:34:38.52ID:0MG9/7scr
ブック名を入れてみたら
2019/04/27(土) 12:41:15.22ID:0MG9/7scr
for iIndex=1 to workbooks("xxx.xls").sheets.count
workbooks("xxx.xls").sheets(iIndex).name
2019/04/27(土) 12:54:30.18ID:Nwb++xAe0
>>9
悔しいから反応してるんだろww
2019/04/27(土) 13:03:37.89ID:Nwb++xAe0
>>14
それ、前スレで言われてた副作用のある操作は難しいってのに該当する。

セルに入力中はVBAの実行が普通は出来ないから。
2019/04/27(土) 13:09:43.12ID:V/rwcmys0
ActiveSheet.Cells(1, 1) = "シート名一覧"
Dim iIndex As Integer

For iIndex = 1 To Worksheets.Count
ActiveSheet.Cells(iIndex + 1, 1) = Worksheets(iIndex).Name
Next iIndex

全く何がしたいのかわからない
2019/04/27(土) 13:11:56.45ID:Nwb++xAe0
>>20
それをfunctionにしてセルの中からよび出そうとしてる。

それでは動かない筈。
2019/04/27(土) 13:15:34.87ID:aEScOWQbx
>>14
ActiveCellが悪さしてそう
シート名を二次元配列に格納してセルにペーストした方が速いだろう
2019/04/27(土) 13:19:58.15ID:0MG9/7scr
sheet1と表示されるなら、sheet2がないためエラーが発生してるんじゃない
関数は個人用マクロブックとかに書いてあるとか
2019/04/27(土) 13:20:05.54ID:V/rwcmys0
>>21
そんなの単純に
A1 =fnEnumSheetName() と入力すると
このファンクション内で最初に書き換えるから?最初でなくても矛盾が生じる
から、動かなくても問題ない、そこに居れた式を書き換えたらなりたたない

当然だろ、何か考える必要あるのか?
2019/04/27(土) 13:25:15.46ID:Nwb++xAe0
>>24
いや、だから元々の質問は成り立たせたいわけだろ。
2019/04/27(土) 13:28:49.05ID:Nwb++xAe0
あと、シート自体にロックが掛かってるから入力中は動かないよ。
2019/04/27(土) 13:36:42.57ID:V/rwcmys0
>>25
単純に考えても成り立たないだろ、ってかセキュリティもあったもんじゃなくなる
式を「A1」に入れて「A1」を書き換えたら
2019/04/27(土) 13:38:26.20ID:S53FxUuZ0
ありがとうございます

ブック名を指定しても
A1にシート名一覧を表示しないようにしても
同じ結果でした
2019/04/27(土) 13:42:36.94ID:V/rwcmys0
>>28
すまないけど、人に分かるように書き込みできんのかな?
2019/04/27(土) 13:42:59.47ID:S53FxUuZ0
混乱してるみたいなのでまとめます

>>14の状態(コメントアウト有り)では
A1のシート名一覧は表示され
Debug.PrintもSheet1〜Sheet3まで表示されます
コメントアウトしている部分で書き換えているのはA2〜A4です
2019/04/27(土) 13:44:30.42ID:rUmkpmPg0
>>18
>>18ww
2019/04/27(土) 13:47:01.70ID:S53FxUuZ0
>>29
fnEnumSheetName = "シート名一覧" 'ここはコメントアウトしなくても問題無い

という事です
2019/04/27(土) 13:47:02.53ID:0MG9/7scr
すまんかった
>19が正解っぽい
sheet1だけなら
fn〜=application.thiscell.parent.nameで拾える
A1を書き換えようとすると2016では循環参照の警告がでる
2019/04/27(土) 13:52:49.27ID:S53FxUuZ0
>>33
そうなんですね

ではA1には式を入力するだけという事にしておいてください
ですがそれでも解決はしません

ActiveCellの部分を他の方法でやってみます
2019/04/27(土) 14:02:54.56ID:V/rwcmys0
>>34
独自関数は、自分のセルを計算するだけにしておけよ
それ以外を許すと全く分からなくなる
その程度のことも判断しないとな
2019/04/27(土) 14:16:52.17ID:S53FxUuZ0
>>35
失礼ですがあなたの指摘(A1が云々)は本題とは関係無いんです
コメントアウトしても同じ結果だったので
2019/04/27(土) 14:42:51.99ID:Nwb++xAe0
>>31
その反応が面白いwww
2019/04/27(土) 14:50:38.26ID:Nwb++xAe0
>>30
だから、コメントアウトしたのは入力したシート内のセルに入力するコードだろ。

そういうのは普通は動かないんだ。
動かすことは出来るけど難しい。
例えばA1に途中迄入力してセル内カーソルがある状態でVBAを動かそうとしても動かない。

じゃあ、どうやってやるかと言えばSetTimerを使えば出来る。
ただし、使いなれた人じゃないと大変危険だ。
2019/04/27(土) 14:51:15.82ID:rUmkpmPg0
>>37
>>18w
2019/04/27(土) 14:52:49.56ID:Nwb++xAe0
まあ、実際の所、>>35に賛成だね。
こういう処理はセルへの入力をトリガーにすべきじゃないな。
2019/04/27(土) 14:53:11.87ID:Nwb++xAe0
>>39
悔しいから反応するわけだw
2019/04/27(土) 14:55:56.58ID:b8TiPyfa0
>>36
関数内で配列を作って返し、複数セルにわたって配列数式での入力(ctrl + shift + Enter)にすればできる
2019/04/27(土) 15:16:12.29ID:rUmkpmPg0
>>41
>>18
痴呆は同じ事を何度も繰返す
まあその程度の知恵しかないからしょうがないんだろうけどw
2019/04/27(土) 15:17:32.57ID:S53FxUuZ0
配列にしたらできました
ですがシート数が固定ではなくセル選択範囲がネックになるので
ボタンをトリガーにして当初のコードを利用する事にします

ありがとうございました
2019/04/27(土) 15:26:37.85ID:b8TiPyfa0
>>44
配列の長さを越える範囲を選択しても下の方が#NAになるだけで上側は有効だけど、
確かに見苦しいからそのやり方の方がいいだろうね
2019/04/27(土) 15:43:11.43ID:t5jYwzHf0
>>14
Excelの決まりとしてセルに入れた数式の結果はあくまでそのセルだけのもの
他のセルを弄るというのはセル数式の領域外
だからActiveCell.Offset〜があるとエラーになる
こういう場合はコマンドボタンとか付けてそれ押したら指定先のセルに表示するとかする
2019/04/27(土) 17:29:07.12ID:S53FxUuZ0
ありがとうございます
2019/04/27(土) 19:02:45.87ID:oGcERCTJM
シートの上限を制限できるなら
Public Function fnEnumSheetName(Index As Integer) As String
If 1 <= Index And Index <= ActiveWorkbook.Worksheets.Count Then
fnEnumSheetName = ActiveWorkbook.Worksheets(Index).Name
Else
fnEnumSheetName = ""
End If
End Function
を定義して
A1に =fnEnumSheetName(Row()) を入力
あとは必要分を A2 から下に関数コピーすればいい
2019/04/27(土) 19:51:55.22ID:Nwb++xAe0
>>43
プッw
自己矛盾は認めるのかw
2019/04/27(土) 19:56:38.58ID:vRc/Njpl0
色々なシートを触る時、.activateは入れますか?

set sheets("sheet1") = foo
set sheets("sheet2") = bar
foo.activate
foo.cells(1,1)="str"
bar.activate
bar.cells(1,1)="str"

要は
cells(1,1)="str"
とシート名を抜かしてしまった時の保険なんですが、止めたほうが良いでしょうか?
また、シート名を忘れた時にエラーが出る等、わかるようにする方法ってありますか?
2019/04/27(土) 20:12:40.86ID:Nwb++xAe0
Activateなんて殆ど使うことは無い。
と言うより、シート名を抜かすことなんて有り得ないというくらい無い。
寧ろブックも省略しない。
だからWithかSet sht=Workbooks("hoge.xlsx").Worksheets("fuga")
をたいてい使う。
2019/04/27(土) 20:13:58.60ID:Nwb++xAe0
ああ、よく見てなかった。
Set使ってるじゃん。
それなのに抜かすことが有るの?
2019/04/27(土) 20:15:01.27ID:Nwb++xAe0
よく見たら間違ってた。
2019/04/27(土) 20:39:24.98ID:vRc/Njpl0
>>52
はい
もちろん最初からこの形なら良いのですが、
1シートしか使わないマクロでシート名を抜いて記述
その後、2シート以上に増えた時、改修する時に抜ける事があるのです
1シートだけでもシート記述した方が良いんでしょうかねぇ
2019/04/27(土) 20:53:55.77ID:Nwb++xAe0
>>54
関係ない。
というか染み付いた方が良いと思うよ。
シート数がどうとか考えることもなく自分は省略しない。
それにブックを複数開くことって無いの?
2019/04/27(土) 21:40:11.04ID:t5jYwzHf0
>>50
原因がわからないエラーじゃないんだから保険ではなくきちんと明示するようにしよう
書き忘れてエラーが出たらそれをちゃんと直すようにしよう
中途半端な保険なんて入れておくとますます不備に気付けない
自分の簡単なチェック方法は前にドットがついてないrangeとcellsを全部検索するようにしてる
2019/04/27(土) 21:53:22.78ID:rUmkpmPg0
>>49
まだ言ってるのかw
それを自己矛盾と言張るならお前も根拠出せって話な
2019/04/27(土) 21:56:32.16ID:JuyaDe8h0
>>55
ありがとうございます
癖にしていきます

ブックを複数開く事は滅多に無いです
基本的にそのブックにマクロをもたせるようにしています
2019/04/27(土) 21:58:54.29ID:rUmkpmPg0
>>50
シート名忘れるような奴はそのうちActivate指定も忘れたり間違えたりすると思うぞ
そもそもそんな保険を掛ける前に
> set sheets("sheet1") = foo
とか書いて疑問に思わない自分の頭を心配した方がいい
2019/04/27(土) 22:03:53.98ID:Nwb++xAe0
>>57
www
正式な方法があるか無いか分からないのに「無い」と言い切ったことが根拠だと何度言ったらww
2019/04/27(土) 22:11:38.42ID:JuyaDe8h0
>>59
それもそうですね
ちゃんと書くようにします

そして酷い間違いすいません
2019/04/27(土) 22:24:21.55ID:rUmkpmPg0
>>60
それじゃねーよ、バーカ
これの根拠書けって話な

>> 857
On Errorしかないのが正式なら同じだし、
On Error以外に正式なものがあれば問題ないし、
2019/04/28(日) 03:00:41.86ID:4bLnIwms0
スポーツの試合だとお互いの実力が拮抗していると長くなるよね
2019/04/28(日) 08:28:37.40ID:FKjutIP90
>>20
> ActiveSheet.Cells(1, 1) = "シート名一覧"
これはセルの値を変更だろ
下のは式としては=Test()で表示としてはSampleになるから別物
混乱させようとした愉快犯か?

Public Function Test() As String

Test = "Sample"

End Function
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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