Excel VBA 質問スレ Part77 at TECH
[2ch|▼Menu]
[前50を表示]
450:デフォルトの名無しさん
22/08/31 02:50:20.75 Ie2cpGsY0.net
>>449
そのコレクションの中身はどうやって保守するのかね?

451:デフォルトの名無しさん
22/08/31 19:22:22.41 QCzzbP6t0.net
>>448
ツルツルがいいのは下の毛です

452:デフォルトの名無しさん
22/08/31 22:52:05.08 q/z2hnkB0.net
>>451
お、おうw
しかし真夏にはツルッツルもなかなか良いわ涼しい

453:デフォルトの名無しさん
22/09/01 03:46:18.56 Xg3rwxDQ0.net
win10
excel2019
Sub y()
Dim st As Range
Set st = Worksheets("参加者").Range("A1:BA80").Find(What:="氏名")
If st is Nothing Then
else
Debug.Print st.Row
end if
End Sub
これをすると"氏名"文字列に一致したセルがrangeオブジェクトで貰えますけど
本当に欲しいのは氏名のx個下のrangeオブジェクトなのです。
氏名のセルと参加者の開始セルの相対位置は固定的です。
氏名はいろいろな名前があるのでマッチングしづらいので氏名で位置を探って取り込んでいます。
rowやcolumnくらいしか使いませんけど、すっきり感としては本当に欲しいのは氏名の開始セルのrangeオブジェクトなのです。
返り値のrangeオブジェクトをずらすということはできますでしょうか?

454:453
22/09/01 03:53:25.83 Xg3rwxDQ0.net
Set st = Worksheets("参加者").Range("A1:BA80").Find(What:="氏名").offset(1,1)
こんな感じで解決しました。
動いてるのはまぐれでしょうか?

455:デフォルトの名無しさん
22/09/01 06:49:22.79 UMivoEC40.net
>>453
何やってるかわからんままコピペして動かしてる感をヒシヒシと感じるので
Rangeオブジェクト
Findメソッド
Offsetプロパティ
について理解できるまで解説サイト読んでください
あと、>>445についても回答付いてるんだからなんかリアクションしてください

456:デフォルトの名無しさん
22/09/01 09:42:20.83 wgtUDrt5a.net
451
おまわりさんこいつです

457:デフォルトの名無しさん
22/09/01 10:01:37.99 Ak8bAeS9M.net
VIO脱毛する人が増えてる

458:デフォルトの名無しさん
22/09/01 10:51:28.10 Xg3rwxDQ0.net
>>455
何度か書き込もうとしたんですけど、書き込みエラーになってしまっていました。
なんだかレスアンカーが不正とか出てきてたのでわからなくなりました。
レスアンカーをつけちゃいけないみたいな制約?
>>445に回答いただいた方ありがとうございました。
これも書き込めないかもしれませんが。
RangeオブジェクトのOffsetメソッド?は結合セルがやっかいなのですね。
結合セルでない時のエラー処理を加えると結局コードが汚くなっていくジレンマでした。
オブジェクト型がなかなか理解できません。
dim wf as object
set wf = worksheetfunction
とやってもwf.でエクセル関数を使えるようになるわけではないみたいですし。
ありがとうございました。

459:デフォルトの名無しさん
22/09/01 11:00:01.20 Xg3rwxDQ0.net
Function wf() As WorksheetFunction
Set wf() = WorksheetFunction
End Function
こっちで呼び出し短縮は出来ました。初めて使いましたfunction

460:デフォルトの名無しさん
22/09/01 14:07:42.09 Xg3rwxDQ0.net
名前付きセル範囲を使うためにnamesコレクションを理解しようとしてるのですが、
activeworkbook.namesをfor eachに入れると現在は1個しか出て来なくて
値が
=#NAME?
こんなのです。エクセルの方から名前の管理を開いてもこの名前は出てきませんし、何も出てきません。
何なのでしょうか?この値は?
なにも設定されてない時の値かと思ってワークシートのあるセルに名前の設定をしみたのですが、
やはりこの値は残ったままでした。
RefersToでもvalueと同じく
=#NAME?

461:460
22/09/01 14:14:01.95 Xg3rwxDQ0.net
わからないまま、vbaから非表示を表示させるコードをコピペして削除しておきました。
こんな名前作った覚えはないですが

462:デフォルトの名無しさん
22/09/01 14:38:52.05 nUWOz2Sg0.net
そっか、うんうん、非表示を表示ね、良かったね
はい次の方

463:デフォルトの名無しさん
22/09/01 15:07:23.09 xiyCUJHG0.net
ニートならロン毛にしろよ

464:デフォルトの名無しさん
22/09/01 19:17:21.60 Xg3rwxDQ0.net
Range型と配列の違いが後一歩わからないのですが、
Sheet1にA1=10,A2=20,A3=30,B1=40,B2=50,B3=60....みたいにしてar(2,2)と近い感じにしてます。
Sub Sample1()
Dim ar(2, 2) As Variant
ar(0, 0) = 10
ar(1, 0) = 20
ar(2, 0) = 30
ar(0, 1) = 40
ar(1, 1) = 50
ar(2, 1) = 60
ar(0, 2) = 70
ar(1, 2) = 80
ar(2, 2) = 90
Debug.Print TypeName(ar)
Debug.Print TypeName(Worksheets("Sheet1").Range("A1:C3"))
End Sub
arはvariant型の配列でWorksheets("Sheet1").Range("A1:C3")はrange型のオブジェクトになるんですよね。
感覚的にはどちらも配列を渡している気分なのですが、セル範囲参照のrangeだからrange型オブジェクトになるってだけですか?

465:デフォルトの名無しさん
22/09/01 19:18:06.47 EeQXBP72d.net
馬鹿過ぎてやばい奴が来てる

466:464
22/09/01 19:23:31.46 Xg3rwxDQ0.net
for each のinの後に配列をおいても、range型オブジェクトをおいても
同じように中身を取り出してくれるから混乱してしまったのかもしれません。

467:デフォルトの名無しさん
22/09/01 19:28:08.64 bYXIuDKK0.net
もし Dim ar(2, 2, 2) As Variant なら3次元の配列としか言いようがない

468:デフォルトの名無しさん
22/09/01 20:43:50.82 QMR92n1t0.net
本人は切実なんだろうけどイマイチ何を理解しようとしているのかが汲み取れない。
とりあえず、シートは二次元配列みたいなものと思えばいいんじゃないかなぁ。
バリアント型の変数に範囲指定したrangeを代入したら配列が出来上がるんだから。。。
って、こういうの説明するのって余計に混乱させそうで怖いのよね。

469:デフォルトの名無しさん
22/09/01 22:31:39.49 xiyCUJHG0.net
なんでそんな事やっているんだろう。。??

470:デフォルトの名無しさん
22/09/01 23:45:17.73 7Zuj6Csb0.net
Rangeオブジェクトと配列、全く異質のものなのに同じ代入インターフェースがつかえるのが不思議なのでしょう
女学生は貧困で給食費すら払えないのに上級国民は交通費で200万円貰えるのですから

471:デフォルトの名無しさん
22/09/02 00:10:13.04 vXxCvmAd0.net
>>464
配列には数字しか入っていませんが、
Rangeオブジェクトには数字以外に色や罫線やハイパーリンクなど色々な情報が入っています。というかワークシートのセルそのもの(オブジェクト)です。

472:デフォルトの名無しさん
22/09/02 03:22:55.43 XYWvvS0T0.net
>>464
オブジェクトにはデフォルトプロパティというのがあってな
オブジェクトを参照してるつもりでも、実はそのデフォルトプロパティを参照してるんだよ
Worksheets("Sheet1").Range("A1:C3")はRange型だが、
そのデフォルトプロパティは2次元配列なのだよ

473:デフォルトの名無しさん (ワッチョイ 023e-y80L)
[ここ壊れてます] .net
URLリンク(www.tipsfound.com)

このコードでcsvファイルをエクセルの指定のシートに取り込めますか?

474:デフォルトの名無しさん
22/09/02 07:13:47.06 rviUcujq0.net
>>473
やってみて聞いてるの?自分でやるのが面倒臭いからとりあえず聞いてるだけ?

475:デフォルトの名無しさん
22/09/02 07:18:17.22 K+fb6kZO0.net
最近のレベル低下には目を見張るものがあるな

476:デフォルトの名無しさん
22/09/02 07:25:48.67 +uzTYabFM.net
総合相談所で総スカンされた馬鹿だろ

477:デフォルトの名無しさん
22/09/02 11:01:00.75 BYdQXtrB0.net
いや、そもそも何でそんな事やりたいのか??
という質問自体がさ

478:デフォルトの名無しさん
22/09/02 12:33:00.40 MAC5jHq+0.net
よそのサイトなんだから作った奴にきけばいいのにと思う今日この頃

479:デフォルトの名無しさん
22/09/02 14:51:15.82 BYdQXtrB0.net
ど正論出ました
終了

480:デフォルトの名無しさん (ワッチョイ 5f3e-NodX)
[ここ壊れてます] .net
>>476
あれ総スカンだったんですか?
外部データの取り込みでcドライブのファイルを取り込んでいるのに

そのエクセルのファイルを他の人にコピーして渡したら同じ場所にファイルを配置しているのにファイルが読み込めないって聞いただけなのに笑

481:デフォルトの名無しさん
22/09/03 12:58:16.39 WuOEJ3Bid.net
あっちでも総スカンだしここでも総スカンなんだからもういいでしょ
レベル低いよあんた

482:デフォルトの名無しさん
22/09/03 14:11:09.43 fgoOqg3v0.net
しつこい馬鹿

483:デフォルトの名無しさん
22/09/04 02:41:16.33 +4pXrWCU0.net
向こうの総合相談スレはこのスレと違って厳しい人ばかりだからな。

484:デフォルトの名無しさん
22/09/04 17:26:08.83 nTptsQZA0.net
>>483
VBAのスレよりも質問スレは厳しい人ばかりなんですね

485:デフォルトの名無しさん
22/09/04 21:22:49.28 +4pXrWCU0.net
少しでも的外れな質問したら総スカンだからな。
初級者だろうが容赦ないのが向こう。

486:デフォルトの名無しさん
22/09/04 22:38:27.70 I+EDFKibr.net
replace関数でワイルドカードを使用してるのですが、
うまく置換していくれないのでなぜですか?
やりたいこと A1セルのKKK1111というデータを2222に変換したい
replace("A1","*" & "K"& "*","2222" )

487:デフォルトの名無しさん (ワッチョイ 07a5-Iguz)
[ここ壊れてます] .net
REPLACE(文字列, 開始位置, 文字数, 置換文字列)

488:デフォルトの名無しさん
22/09/04 23:39:15.09 +4pXrWCU0.net
優しいなみんな
総合スレだったらフルボッコ

489:デフォルトの名無しさん
22/09/05 18:43:28.63 8FlTtg5u0.net
初心者あるあるなんだろうか

490:デフォルトの名無しさん
22/09/05 22:48:54.81 C53zNTJD0.net
ありがとうございました。
ユーザー定義型と連想配列を知って少し前進しました。
検索掛けてもなかなかでないので教えてください。
dim i
for i....
使い終わったらiを未定義に戻したいんですが、
宣言の反対?になるような未定義に戻す関数?ステートメント?はありませんか?

491:デフォルトの名無しさん
22/09/05 23:44:13.97 ZiXiUX+x0.net
無いし気にする必要もない

492:デフォルトの名無しさん
22/09/06 02:21:14.99 xcONMZhZ0.net
>>490
ちなみに戻したい理由は何?

493:デフォルトの名無しさん
22/09/06 03:38:48.46 DWdJNYk/d.net
馬鹿に理由を問う虚しさ

494:デフォルトの名無しさん
22/09/06 05:21:21.45 Fb+lfM05d.net
変数は使い捨てだよVBAの場合

495:デフォルトの名無しさん
22/09/06 06:55:14.80 FWLy+pWW0.net
プロシージャ内で宣言した変数ならプロシージャを抜ければクリアされるしマクロ全体が終了すれば全てクリアされるからあまり気にしない。
privateやpublicで宣言したオブジェクトなら明示的にnothingをsetすることはあるけど、イマドキのPCでメモリ解放もあまり気にする必要はない気もする。
エラーで止まったときを考えると念の為しておくくらいかなぁ。

496:490 (ワッチョイ bf66-bBdM)
[ここ壊れてます] .net
初心者なのでプロシージャ内で処理の順番を変えたくなる時があります。
使う直前に宣言したいのでプロシージャの初めに宣言は出来ればしたくありません。
コピペでソースコードを入れ替えて処理の順番を変えるとforが1回目とfor2回目が入れ替わってしまう事があります。
だから毎度forを使う前は、foreacheもそうですが、宣言が必要かをプロシージャ内を戻って探します。
forが終わるたびに未定義に出来ればいいなと思ったのは使い終わった変数名が後からかぶっても
使い終わった時点で未定義に戻しておけばエラーも不具合も出ないからです。
他の言語だとあるのであるかなと思ったのです。

497:デフォルトの名無しさん
22/09/06 10:03:36.29 Z9J6cI+IM.net
はい、わかりました

498:デフォルトの名無しさん
22/09/06 10:56:34.50 MUc/w1ud0.net
>>496
>他の言語だとある
これ本当?

499:デフォルトの名無しさん
22/09/06 11:47:55.76 DWdJNYk/d.net
馬鹿ではなく糖質かな

500:デフォルトの名無しさん
22/09/06 11:53:04.38 o3g0SSKzd.net
会社のパソコンでvbsからエクセルvbaを起動させメール本文、添付ファイルを作成し添付、outlookでメール送信をしたいのですがOutlookが起動しません。
エクセルから手動でvbaを起動すると正常に動作するのですが、vbsから起動するとタスクバーのエクセルが点滅し停止します。
特にエラーを吐いている様子はありません。
何か思いあたる部分があればご教示ください

501:デフォルトの名無しさん
22/09/06 12:06:14.05 QxRWO4Sk0.net
漏れの推測だけど、
>タスクバーのエクセルが点滅し
これは、バックグランドで起動しているのでは?
それで、エクセル内のマクロなどが起動しないとか?

502:デフォルトの名無しさん
22/09/06 12:18:01.17 iobTnTaB0.net
>>498
定義済みが未定義になるわけじゃないけど
ブロックスコープとかいうやつだな
残念ながら旧VBやVBAにはない。VB.NETにはあるけど
VBAの一番狭いスコープはプロシジャ
なので、プロシジャの先頭に宣言まとめとけって作法がある

503:デフォルトの名無しさん
22/09/06 13:03:51.66 BhZhCXYFd.net
>501
vba自体は動作しております。
手動でvbaを起動するとエクセルが開き添付ファイルなどを作成し、Outlookで送信するのですが
vbsでの起動だと添付ファイルまでは作成するのですが、Outlookが立ち上がらず、タスクバーのエクセルが点滅して動作が止まります。
ネットで調べても事例が出てこず、会社のパソコンなのでシステム管理者に制限をかけられているのか…
何か調べる方法がありましたら教えてください

504:デフォルトの名無しさん
22/09/06 13:07:25.60 Z9J6cI+IM.net
printfデバッグでどこまで動いているか確かめましょう!

505:デフォルトの名無しさん
22/09/06 13:13:46.25 Td+5EGNEa.net
>>496
始めに宣言を書いている方が探しやすいと思うけど
要らなさそうなものはまとめてコメントして確認すればいいわけだし

506:デフォルトの名無しさん (ワッチョイ 07da-oTx6)
[ここ壊れてます] .net
VBAでメールとか初めて見た

507:デフォルトの名無しさん (ワッチョイ e72f-HH83)
[ここ壊れてます] .net
>>500
手動で実行できるなら、VBSで起動しているときのユーザとその権限があやしい
つかエラー吐いてないんじゃなくて、ちゃんとエラー捕まえられてないだけだと思うが

あとスクリプト系からのメール送信はいろいろセキュリティ周りでチェックされるかもしれん
とくに会社で管理されてるようなPCなら、ちゃんと管理者に許可とってからやれよ

508:デフォルトの名無しさん (ワッチョイ 2749-DXwO)
[ここ壊れてます] .net
メール送信用のc#のexeつくって呼び出させるようにしたことならある
あとsendgridAPIよぶの
前者は他にも使い回したな。.NETcoreだった気がするからいつまで使えるやら

509:デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
[ここ壊れてます] .net
>>498
あるものもある、例えばPowerShellにはそのものズバリのRemove-Variableなんてものがあったりする

510:デフォルトの名無しさん
22/09/06 16:28:13.42 QxRWO4Sk0.net
>>503
>タスクバーのエクセルが点滅して動作が止まります
バックグランドで起動しているだけじゃ、エクセルのマクロが実行されないのかも
printf デバッグで、どこまで動いているか確かめるべき!
エクセルのマクロの、Outlook の起動コードの前後で、何かを出力すれば?
Outlook の起動前に、端末・ファイルへ出力する
Outlook の起動コード
Outlook の起動後に、端末・ファイルへ出力する

511:デフォルトの名無しさん
22/09/06 20:05:52.59 D5ckGmEva.net
動作が止まるのは終了したからかもよ

512:490 (ワッチョイ bf66-bBdM)
[ここ壊れてます] .net
>>505
なるほど。そういう方もおられるのですね。
EXCEL VBAのプロシージャはあんまり長くしない方がいいよみたいなサイト読んで影響受けてます。
コードの書き方って結構こだわりを持っている方がいるようで、自分はそれに影響を受けやすい方です。
自分もこだわりたい方なんだと思います。

EXCEL VBAを知って、宣言は直前が基本ですよみたいな記事読んで強く影響受けました。
だから使い終わるごとに未定義に出来れば毎度宣言しなおせるからすっきりするのになぁみたいな気持ちでした。
EXCEL VBAとしてはfor やfor eachに使うような変数は先頭宣言にしてやっていこうと思います。

513:デフォルトの名無しさん (ワッチョイ 47ac-DXwO)
[ここ壊れてます] .net
ちゃんとfunction分けてたら直前でいいけど、
大抵クソデカ関数ひとつか、グローバル宣言祭りだろうからなあ

514:デフォルトの名無しさん
22/09/06 20:37:51.18 z3X/Y8zI0.net
>>512
> EXCEL VBAとしてはfor やfor eachに使うような変数は先頭宣言にしてやっていこうと思います。
とりあえずそれで動くところまで持って行ってコードが固まったらこだわりのコードスタイルにリファクタリングすればいいかと

515:デフォルトの名無しさん
22/09/06 21:28:56.11 3UeoLADl0.net
>>512
>他の言語だとあるのであるかなと思ったのです。
他の言語って具体的に何?
答えられない?逃げる?それともまた言い訳?

516:デフォルトの名無しさん
22/09/06 21:54:35.94 iobTnTaB0.net
>>512
個人的に、VBAに限定した話で宣言は直前とかいう記事はあんまり信用できないと思ってる
最近の言語ならそれで良いんだけどね

517:デフォルトの名無しさん
22/09/06 22:58:52.94 z3X/Y8zI0.net
>>515
>>509
煽るならもうちょい知識をつけてからにした方がいい

518:デフォルトの名無しさん
22/09/06 23:05:26.43 NuTb9qxy0.net
あまり複雑化しても辛くなるしな
シンプルにシンプルによ

519:デフォルトの名無しさん
22/09/07 07:28:44.73 TmSq6TyA0.net
>>516
どういうこと?
最近の言語と違って
・ブロックスコープがない
・宣言と同時に代入できない
以上VBAの特徴2点を差し引いたとしても、
先頭宣言が直前宣言より優れている所なんかひとつもないと思うんだが

520:デフォルトの名無しさん
22/09/07 09:01:28.19 l5y/t4MDM.net
個人的信条を議論するのは無意味

521:デフォルトの名無しさん (アウアウクー MMbb-2Jzk)
[ここ壊れてます] .net
変数はImmutableにするのが最近の言語でしょ
こうなるもうどこで宣言しようが関係ない

522:デフォルトの名無しさん
22/09/07 19:33:33.73 nObPwJJb0.net
>>519
まあ>>520に同意しつつ、一番の理由は、
VBAでの一般的なスタイルに反するからなんだが
ブロックスコープがないのに直前で変数宣言するのは、
違うブロックで宣言された変数と宣言が被るリスクが上がるだけなんだが
むしろ直前宣言が優れている点ってどこだよ?

523:デフォルトの名無しさん
22/09/07 19:40:46.55 qgePcMk7a.net
>>519
同意する
まあ>>516は理由を書いてない時点であまり信用できないと思ってる

524:デフォルトの名無しさん
22/09/07 19:45:10.64 qgePcMk7a.net
>>522
> 違うブロックで宣言された変数と宣言が被るリスクが上がるだけなんだが
そんなものどこで宣言しても同じだろ
> むしろ直前宣言が優れている点ってどこだよ?
コードを追う時に見える範囲に宣言あれば型とかも分かるだろ

525:デフォルトの名無しさん
22/09/07 19:47:45.63 URQHgzNh0.net
>>522
・別functionにしない
・設計が出来ない
・順番がコロコロ変わる
こういう場合は直前の宣言がいいんだろうな

526:デフォルトの名無しさん
22/09/07 19:48:48.00 ie60y+bR0.net
インデックスとはいえ変数を使い回すのはNGなのです!
VBAだとしても許されません!ロボコン0点

527:デフォルトの名無しさん
22/09/07 20:14:29.57 lr2lUZXda.net
質問でもなく他人のコードの変数をどこに書こうがどうでもいいのに書き方に熱くなる人はバカなんだろうね
まあそういう技術的な部分に関係ないところしか語れない程度が集まるスレなんだろうけどw

528:デフォルトの名無しさん
22/09/07 20:36:38.49 pBpkzzj3a.net
>>527
そんなに熱くなるなよw

529:デフォルトの名無しさん (スッップ Sd7f-VPUc)
[ここ壊れてます] .net
>>517
で、答えられずに逃げたのかよ

530:デフォルトの名無しさん
22/09/07 20:55:49.52 qYDBMpOU0.net
>>529
マジでアホなの?
PowerShellって書いてあるだろw

531:デフォルトの名無しさん
22/09/07 21:25:08.49 dOhAzb3IM.net
>>530
へー、shellコマンドと言語の違いがわからない人か
納得

532:デフォルトの名無しさん
22/09/07 21:50:42.41 qYDBMpOU0.net
>>531
PowerShellって結構リッチなプログラム言語ですけど?
頭大丈夫?

533:デフォルトの名無しさん
22/09/07 22:25:03.60 GXE70sRqM.net
シェルとシェルスクリプトは間違えてませんですわー

534:デフォルトの名無しさん
22/09/07 22:55:46.20 N0bzWtYO0.net
>>524
そうね。ブロックスコープは確かに便利。
ただ、匙加減の問題にもなるけど
ブロックスコープに慣れるとついつい
単一責任原則の考え方がおざなりになりがちで
密結合なものを作ってしまい易くなる。
なので、あくまで俺はだけど
EXCELのVBAに関してはメソッドや関数の
頭に変数定義を行うようにしている。
それでコードが読み辛くなるようであれば
その時点でリファクタリングの対象になるという考え。

535:デフォルトの名無しさん
22/09/07 23:29:34.28 N0PmJDO50.net
でも誰も読まないんだよなー

536:デフォルトの名無しさん
22/09/07 23:46:23.08 QgSPv1dJ0.net
ここの回答者は上級者なんだからVBAの事端から端まで知っていると思っていたんですけど??
なんでこんなに荒れているのですか?

537:デフォルトの名無しさん
22/09/07 23:51:19.61 oCHm3LOdM.net
VBAで単一責任て
そもそも表計算ソフトで画面やDBモドキ作ってる時点でおかしいと思わないのか

538:デフォルトの名無しさん
22/09/08 00:18:03.89 GEpvz+Yp0.net
知識と人間性には何も関係がないからじゃね

539:デフォルトの名無しさん
22/09/08 01:29:45.47 ih3U5PTX0.net
だって回答者に回れるって事は知り尽くしてるって事なんでしょ?
ちょっと詳しいだけじゃ回答できるはずないもんね?

540:デフォルトの名無しさん
22/09/08 01:40:01.52 eb3KVsRH0.net
>>539
ソースは?
誰の発言?

541:デフォルトの名無しさん
22/09/08 04:43:57.30 dSUuwrfW0.net
>>534
なので、の前後の関係がよくわからん
> EXCELのVBAに関してはメソッドや関数の頭に変数定義を行うようにしている。
それこそ余計蜜結合になるかと

542:デフォルトの名無しさん
22/09/08 06:11:23.79 vw1M88UR0.net
誰が上級者と認定したん?
ここのカキコに資格試験なんかあるかいな・・・
回答が使えるかどうか、正しいかどうかが全てじゃ。

543:デフォルトの名無しさん
22/09/08 06:33:16.02 13BgqVgC0.net
どこで宣言するか問題って、画面上部をスクロールせず固定出来るようになれば解決するんだろうな。
エクセルは出来るんだから、VBAの画面も出来るようにして欲しいものだ。

544:デフォルトの名無しさん
22/09/08 06:54:06.36 9KZ4CtoQa.net
>>543
VBEは昔ながらのUIなので垂直スクロールバーの上部を下にドラッグすると同一オブジェクトコードの水平分割表示ができるけれど

545:デフォルトの名無しさん
22/09/08 08:07:26.88 YfOXyicz0.net
>>541
分かり辛かったかな?
平たく言うと変数が何に使っているか分かり辛くなるような長いコードをひとつの関数やメソッドに書くなということ。
そもそもひとつの関数やメソッドにはひとつの役割だけ持たせるべきで、そうした場合、変数が何に使ってるか分からないくらい長くなること自体あまりないし、
それで長くなるようであればそもそもの作りがおかしいのでリファクタリングの対象とする、ってことなんだけどね。

546:デフォルトの名無しさん (アウアウウー Sa8b-Ro21)
[ここ壊れてます] .net
VB/VBA/ExcelもAccessもOfficeごと窓からポイッ

547:デフォルトの名無しさん
22/09/08 10:06:01.26 dSUuwrfW0.net
>>545
> 平たく言うと変数が何に使っているか分かり辛くなるような長いコードをひとつの関数やメソッドに書くなということ。
それ変数の宣言位置とは違う話だろ
まあ先頭に変数宣言するメリットを説明できないならいいや、バイバイ

548:デフォルトの名無しさん (ワッチョイ 5f4f-ozIc)
[ここ壊れてます] .net
>>547
なんで?
どうせ同じ関数内で同じ名称の変数なんて作れないんだから
全部纏めて同じ位置にあった方が「この変数はこのシチュエーションのときにこう言った意味で使う」とか命名し易いじゃん。

使ってる変数名を再宣言しようとして「あ」となることもないし、
同じ変数をバカみたいに使い回して本当は値変えると不味かったのに変えちゃったりとかアホなことも減るよ。

549:デフォルトの名無しさん (ワッチョイ 5f4f-ozIc)
[ここ壊れてます] .net
ま、そもそもそんなこと気にするくらい長いコード書いちゃいけないんだけどね。
そちらのレベルに合わせて話してもそれだけのメリットはあるよ。

550:デフォルトの名無しさん
22/09/08 13:19:53.66 E2yDW5TJ0.net
Wordがどうしようもなく使いにくいので、
Excel VBAで代わりのツールを作りたいと思います。
こんな考え方は邪道でしょうか?

551:デフォルトの名無しさん
22/09/08 13:50:27.43 N6XG++JQ0.net
WordVBAを何故つかわない?
マウロ記録がないOutlookVBAやPowerpointVBAなら一瞬気持ちがわかるが

552:デフォルトの名無しさん
22/09/08 14:17:07.18 Sm7a3fWy0.net
loopのカウンタを使用後に消さないと
順番入れ替えたらバグるとか気にする初心者にはvba向いてないと思う

553:デフォルトの名無しさん
22/09/08 16:06:28.64 e4Jhfn6X0.net
ワードにできることはエクセルでほぼ出来るからワードの使いかた忘れてしもた
しかし困ったことはない

554:デフォルトの名無しさん
22/09/08 17:02:48.44 dSUuwrfW0.net
>>548
> 全部纏めて同じ位置にあった方が「この変数はこのシチュエーションのときにこう言った意味で使う」とか命名し易いじゃん。
コボル臭が... w
まあ使ってる近くにあれば宣言なども簡単に確認できるメリットより命名のメリットを重視する人もいるんだね
> 使ってる変数名を再宣言しようとして「あ」となる
んだから
> 同じ変数をバカみたいに使い回して本当は値変えると不味かったのに変えちゃったりとかアホなことも減るよ。
なんてなるわけないと思うけど?

555:デフォルトの名無しさん
22/09/08 19:47:18.35 wUuMBq/Ad.net
Excel → Markdown → Word アウトライン変換のマクロを作れば大分マトモになる予感
Excelの列で見出しを識別する感じで

556:デフォルトの名無しさん
22/09/10 00:50:29.07 yQKHhevv0.net
intersect( activecell.ListObject.HeaderRowRange,activecell.EntireColumn).Address
テーブル上にアクティブセルがあり、そのセルの列ラベルのアドレスを調べたく
こんなのを書いたのですが、もっと他にイケてる書き方はないでしょうか

557:デフォルトの名無しさん
22/09/10 10:48:25.59 +u60WJ7w0.net
activeCell.End(xlUp).Address は?
上に隣接する別のテーブルがないことが条件だけど

558:デフォルトの名無しさん
22/09/10 15:51:20.36 qRafw5tCp.net
>>557
それだとテーブルが1行目開始でなくて
テーブルの項目名の部分にアクティブセルがあった場合は
テーブルから離れた位置にカーソルが行ってしまうな

559:デフォルトの名無しさん
22/09/11 01:14:19.08 W9G67fQJ0.net
バイナリデータの書き込みについて質問です。
hello という文字列をいったんバイナリにしてファイル書き込みするような
プログラムを書いているのですが、書き込みすると
h e l l o
というように変なゴミが入ってきます。
vbaではバイナリデータの書き込みは完全にはできないということなのでしょうか。
該当コード
URLリンク(ideone.com)

560:デフォルトの名無しさん
22/09/11 01:15:18.73 W9G67fQJ0.net
書き込みすると変なゴミデータが見えなくなってしまいましたが、要するに
正確に半角英数字でhelloという文字が再現できないのです。

561:デフォルトの名無しさん
22/09/11 01:27:32.82 PnV//sAoa.net
>>560
どういう内容なのかダンプして確認しないのかい?

562:デフォルトの名無しさん
22/09/11 01:41:57.90 yPB6Wd0g0.net
>>559
Option Explicit
Sub main()
  Dim bs(4) As Byte
  bs(0) = Asc("h")
  bs(1) = Asc("e")
  bs(2) = Asc("l")
  bs(3) = Asc("l")
  bs(4) = Asc("o")
  Dim fn As Integer: fn = FreeFile
  Dim fpath As String: fpath = "C:\指定のパス\output.txt"
  Open fpath For Binary As #fn Len = 1
  Dim i As Integer
  For i = LBound(bs) To UBound(bs)
    Put #fn, , bs(i)
  Next i
  Close #fn
End Sub

563:559
22/09/11 01:50:58.58 W9G67fQJ0.net
>>562
for each で受ける変数をvariant型にするとうまくいかんということですか?
open の変数にLen=1(1バイトごと)っていれられるんですね。

564:デフォルトの名無しさん
22/09/11 01:53:10.28 yv0WXRwp0.net
>>559
説明はちゃんと読もう
vbaはかなりゆるゆる言語なので、なるべくvbaにあわせたコードにしたほうがいい
URLリンク(docs.microsoft.com)
>書き込まれる変数が 数値型の Variant である場合は、Put により、Variant の VarType を識別する 2 バイトが書き込まれた後に、変数が書き込まれます。
こんなもん追いかけてられんよ
ステートメントは極力使わず、関数にした方がいいと思う
もう少し言うと、実現したい事を直接聞いた方がいい。
vbaでバイナリとかめんどくさすぎて誰もやってないので、
できるかどうかなんてあんまりみんな分かってない
>>561
してもあんま意味ないだろ

565:デフォルトの名無しさん
22/09/11 02:05:46.07 yPB6Wd0g0.net
>>563
Len = 1 にしても無駄
あと、EachはVariantしか使えない
>>564
ところがバイナリダンプしてみると1文字あたり2バイトしか書き込まれてないんだよな
その説明の通りだと3バイトずつ書き込まれるはずなのに

566:デフォルトの名無しさん
22/09/11 02:07:03.03 W5Eoe6lQa.net
>>564
今回はもう結果が出ているけれど、入出力を行ったら確認しないのか?
出力結果から意図するものとどう異なるかによって予測できる場合もあるだろ

567:559
22/09/11 02:11:34.10 W9G67fQJ0.net
>>564
正直説明一々読むの大変なのでここで聞いてそのあたりをつけようと思ってます。
>ステートメントは極力使わず、関数にした方がいいと思う
ちょっとここがよくわからないんですがどういうことですか。
>もう少し言うと、実現したい事を直接聞いた方がいい。
vbaの練習のためにとりあえずbase64エンコーディングを実装しようとしてました。
エンコーディングはできました。デコードでつまづいて格闘してましたが、デコードもとりあえずできました。
つぎは、bmpファイルを読み込んで1x1pixcelに縦横絞ったセルのシートに画像表示させるとか
やろうと思ってます。

568:デフォルトの名無しさん
22/09/11 02:12:49.77 yv0WXRwp0.net
>>565
3バイトずつだぞ
URLリンク(i.imgur.com)

569:デフォルトの名無しさん
22/09/11 02:19:41.47 yv0WXRwp0.net
>>567
結局やりたいことはライフゲームとか、画像処理だろう
vbaは、事務処理特化なんだ。本当にやめたほうがいい。
vbaでクリエイティブな事をやろうとすると、めちゃくちゃ遅い
入出力用のセルがすごく見やすいのはわかるんだけど、別言語でやったほうがいい
具体的に言うとC#かvb.netがいい。
jsならそのままアプリにも移行できる

570:559
22/09/11 02:24:11.91 W9G67fQJ0.net
とりあえず入門したいんで、アルゴリズムわかるやつ実装してるだけなんであんま考えてない。
最終的には機械学習実装できりゃいいなと思ってるんで、bitmap表示実装できたら
vbaでそこまでやるレベルになるかなと。

571:デフォルトの名無しさん
22/09/11 02:44:48.34 +Dglx5gI0.net
vbaの使い方間違ってますよ

572:デフォルトの名無しさん
22/09/11 11:47:30.27 scHPWuyOa.net
他人が何をやろうと勝手なんだから質問にこたえないなら放置すればいいと思うけど
説教野郎って減らないよね

573:デフォルトの名無しさん
22/09/11 13:01:03.57 qfkrXmQcd.net
>>567
>正直説明一々読むの大変なのでここで聞いてそのあたりをつけようと思ってます
死ね

574:デフォルトの名無しさん
22/09/11 13:48:26.08 4omWB5g70.net
いや、普通に頭くるだろ?
ダメダメな使い方してると

575:デフォルトの名無しさん
22/09/11 17:18:35.58 9MrulJbSd.net
>>569
ライフゲームってなんなのかグーグルで検索したら
結果ページ上で勝手にライフゲームが始まってたわ
さすがグーグル

576:デフォルトの名無しさん
22/09/11 18:42:32.58 +bJdyqft0.net
>>575
気づいたときにはライフがゲームオーバーになってるよ

577:デフォルトの名無しさん
22/09/11 20:43:41.22 yPB6Wd0g0.net
本当だ
ブラウザの背景でライフゲームが動いてるw
無駄な機能多すぎるだろGoogle

578:デフォルトの名無しさん
22/09/11 22:06:38.09 mrmcBHlY0.net
URLリンク(excel-ubara.com)
エクセルの神髄さんのところにあるクイックソートの引数について質問です
lngMinとlngMaxを必ず指定しないといけないようなのですが、
どんな数字を入れればいいのですか?
 vBase = argAry(Int((lngMin + lngMax) / 2))
こうなっていて、argAryインデックスの2倍を超える数値は入れられないようです。
インデックスとしての真ん中であるなら関数側でuboundとかlboundとかから計算すればいいように思いました。
バブルソートやインサートソートと違ってイマイチやってる事がわからないので、
lngMinとlngMaxの引数にいれるべき数値がわかる方おられましたら教えてください。

579:デフォルトの名無しさん
22/09/11 22:37:51.72 3GTYFVAp0.net
>>578
配列のうちでどこをソートするか指定できるようになってるんじゃないですかね

580:デフォルトの名無しさん
22/09/11 22:42:49.09 6zTUjY+M0.net
>>578
ソートしたいレンジの最初と最後のインデックス
クイックソートは最初にピボットを決めてそれより小さいものをピボットより前に、大きいものをピボットの後ろに移動して、ピボットの前の区間と後ろの区間をそれぞれクイックソートする方法を繰り返す
ピボットの決め方は色々あるけど、その人は配列の真ん中のオブジェクトを選んでるだけ。ランダムに選ぶと平均的には最も良い結果が得られるけど、もうひと手間かかる

581:デフォルトの名無しさん
22/09/12 01:30:49.61 0s0pxnwOM.net
ユーザーフォーム内のコマンドボタンではfunctionの呼び出しはできない仕様でしょうか?
似たようなコードのボタンがあり、特定ブックを取得するための同じコードを全部のボタンに書いています
ごちゃごちゃしてしまっているのできれいにしたかったのですが、functionが呼び出せず変数が空でエラーになってしまいます

582:デフォルトの名無しさん
22/09/12 07:39:53.33 STPpGgy+0.net
>>581
呼び出し出来るよ。そのエラーになったコードをここに書いてもらえれば原因がわかるかと。

583:デフォルトの名無しさん
22/09/12 11:53:11.04 fWVKyvtQa.net
sub から呼ぶとか

584:578
22/09/13 09:42:49.11 g8hgly2P0.net
>>579
やってみたら確かに!驚きです。
>>580
クイックソートって発明品みたいなものですよね。
人間が手動で並べ替えても慣れる程にクイックソートみたいなやり方が高速になっていくんですかね。
皆さんありがとうございました。

585:デフォルトの名無しさん
22/09/13 10:05:15.02 kJFB2T9s0.net
いえいえ

586:デフォルトの名無しさん
22/09/13 23:06:23.52 m4C/g6mCM.net
>>582
フォームが3階層くらいありますが
1.モジュールからフォームの呼び出し
Sub commentForm()
rowBtn = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row
colBtn = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column
大分類.Show vbModeless
End Sub

587:デフォルトの名無しさん
22/09/13 23:09:43.50 m4C/g6mCM.net
すみません、1つ目フォーム呼び出しのモジュール内に以下のコードがあります
Public ShIndex As String
2階層目で3つの大分類の選択
2.分類選択
Private Sub CommandButton1_Click()
'コマンドボタンのタイトル反映 ※エクセルのセルを反映させています。
中分類.CommandButton1.Caption = Worksheets("2-1").Range("C1").Text
中分類.CommandButton2.Caption = Worksheets("2-2").Range("C1").Text
中分類.CommandButton3.Caption = Worksheets("2-3").Range("C1").Text
中分類.CommandButton4.Caption = Worksheets("2-4").Range("C1").Text
中分類.CommandButton5.Caption = Worksheets("2-5").Range("C1").Text
中分類.Show vbModeless
End Sub

588:デフォルトの名無しさん
22/09/13 23:11:31.11 m4C/g6mCM.net
3.さらに次の分類へ
Private Sub CommandButton1_Click()
ShIndex = "2-1"
'コマンドボタンのタイトル反映 ※エクセルのセルを反映させています。
中分類1.Caption = Worksheets(ShIndex).Range("C3").Value
中分類1.CommandButton1.Caption = Worksheets(ShIndex).Range("D3").Value
中分類1.CommandButton2.Caption = Worksheets(ShIndex).Range("D7").Value
中分類1.CommandButton3.Caption = Worksheets(ShIndex).Range("D11").Value
中分類1.CommandButton4.Caption = Worksheets(ShIndex).Range("D15").Value
中分類1.Show vbModeless
End Sub

589:デフォルトの名無しさん
22/09/13 23:36:32.69 m4C/g6mCM.net
4,最終の選択ボタン
コメントアウトの範囲内をfunction(wbSerch)として、値を返して変数を使用したいです
Private Sub CommandButton1_Click()
Dim wbRepName As String
'########## ここから ##########
Dim i As Long
Dim wb As Workbook
Dim wbFullPath As String
For i = 1 To Workbooks.Count
Set wb = Workbooks(i)
If wb.FullName Like "*検索ワード*" Then ' * *に挟まれた文字を含むブックを検索する
wbFullPath = wb.FullName
Exit For
End If
Next
Dim pos As Long
pos = InStrRev(wbFullPath, "\")
If (pos > 0) Then
wbRepName = Right(wbFullPath, Len(wbFullPath) - pos)
End If
'########## ここまで ##########
Dim rowRep As Long
rowRep = Worksheets("シート名").Cells(rowButton, "Q").Value
Dim num As Long
num = 1
If Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 1, "H") = "" Then
Workbooks(wbRepName).ActiveSheet.Range(Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 1, "H"), Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 2, "H")) = _
Worksheets(ShIndex).Range(Worksheets(ShIndex).Cells(3 + (num - 1) * 4, "E"), Worksheets(ShIndex).Cells(3 + (num - 1) * 4 + 1, "E")).Value
End If
Workbooks(wbRepName).ActiveSheet.Range(Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 4, "H"), Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 7, "H")) = _
Worksheets(ShIndex).Range(Worksheets(ShIndex).Cells(3 + (num - 1) * 4, "F"), Worksheets(ShIndex).Cells(3 + (num - 1) * 4 + 3, "F")).Value
End Sub

590:デフォルトの名無しさん
22/09/13 23:37:53.43 m4C/g6mCM.net
コードをアップする際に一部書き換えで変数が微妙に違うのは許してくださいw

591:デフォルトの名無しさん
22/09/14 01:24:17.40 jzWlgqKP0.net
>>589
大量のコード張るなら、どっかコード張るサイトあるからそこ使ってくれ
>コメントアウトの範囲内をfunction(wbSerch)として、値を返して変数を使用したいです
やれば良いとしか
自分でやって動かなかったっていうコード出せよ
エラーが出たならエラー内容も
Functionが呼び出されないんじゃなくて、呼び出したけど値を返してないか
返された値をちゃんと受け取ってないんじゃないかと予想したがな

592:デフォルトの名無しさん
22/09/14 05:04:23.30 Pxkwm+eH0.net
>>589
色々気になるところばかりですが、Functionだけについていうと
Public Function プロシージャ名() As String
'処理
プロシージャ名 = ファンクション内で作成した文字列
End Function
という感じで作って、呼び出す側は下記で
wbRepName = ファンクション名

593:デフォルトの名無しさん
22/09/14 08:09:29.31 wHV8fEyKd.net
>>592
ありがとうございます
やっぱりそれでいいんですよね
とりあえず動かないのは困るので、関数を呼び出すコードは削除してしまったのでまたやり直してみます
適当にネットで検索して継ぎはぎしているのですが、これはやめた方がいいみたいなところがあれば教えていただけると

594:デフォルトの名無しさん
22/09/14 08:09:41.99 wHV8fEyKd.net
>>592
ありがとうございます
やっぱりそれでいいんですよね
とりあえず動かないのは困るので、関数を呼び出すコードは削除してしまったのでまたやり直してみます
適当にネットで検索して継ぎはぎしているのですが、これはやめた方がいいみたいなところがあれば教えていただけると

595:デフォルトの名無しさん
22/09/14 10:47:45.73 DQiHAQaU0.net
>>594
ネットで継ぎはぎはやめたほうがいい

596:デフォルトの名無しさん
22/09/14 14:30:03.63 AS+oyxbj0.net
継ぎはぎっていちばんやってはダメな事でしょ
不具合でたら修正困難


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

322日前に更新/265 KB
担当:undef