Excel VBA 質問スレ P ..
[2ch|▼Menu]
415:デフォルトの名無しさん
22/08/18 16:23:33.57 MNMwm62Z0.net
初歩的な質問なんだけど、上下一致してる場合だけ転記して行くという場合
1行目は例外として省く処理いれて
cells(r-1,1)=cells(r,1)とかってやってくと、不一致のものが現れた時に一致してた行の最初の値が転記できなくなるんだけどどうしたらいい?
100
100
101
101
102
とかって並びの時に、100の一番上が転記されないとか
102とかも転記されない
上下比較の時の最適解の比較方法を知りたい

416:デフォルトの名無しさん
22/08/18 16:23:56.43 X/mZUHYK0.net
>>405
結構面倒、前提条件として「表A, 表Bのコードは各々ソートされてる」かつ「表A, 表Bのコードは各々の表内で重複してない」のであれば...
Type T
S As WorkSheet: L As Long: R As Long: C As Long: D As Long: F As Boolean
End Type
Dim TA As T, TB As T
Set TA.S = WorkSheets("表A"): Set TB.S = WorkSheets("表B")
TA.L = TA.S.Cells(TA.S.Rows.Count, 1).End(xlUp).Row: TB.L = TB.S.Cells(TB.S.Rows.Count, 1).End(xlUp).Row
TA.R = 1: TB.R = 1
TA.F = False: TB.F = False
Dim S As WorkSheet: Set S = WorkSheets("結果")
Dim R As Long: R = 1
Do
G TA: G TB
If TA.F And TB.F And TA.C = TB.C Then
S.Cells(R, "A").Value = TA.C: S.Cells(R, "B").Value = TA.D: S.Cells(R, "C").Value = TB.D: TA.F = False: TB.F = False
ElseIf (TA.F And TB.F And TA.C < TB.C) Or (TA.F And Not TB.F) Then
S.Cells(R, "A").Value = TA.C: S.Cells(R, "B").Value = TA.D: TA.F = False
ElseIf (TA.F And TB.F And TB.C < TA.C) Or (Not TA.F And TB.F) Then
S.Cells(R, "A").Value = TB.C: S.Cells(R, "C").Value = TB.D: TB.F = False
Else
Exit Do
End If
R= R + 1
Loop
Private Sub G(T As T)
If Not T.F And T.R <= T.L Then
T.C = T.S.Cells(T.R, "A").Value: T.D = T.S.Cells(T.R, "B").Value: T.F = True: T.R = T.R + 1
End If
End Sub

417:デフォルトの名無しさん
22/08/18 16:34:05.48 EfwMa2qS0.net
>>416
ありがとぅざいます!
そうなんです
考え出したらこれかなり面倒だなと思って、、
同じような発想かもしれないですが
外のループはA表のコード番号の縦列の値を固定して、
内側ループでB表を縦にコードが一致するまで検知して
一致した場合フラグを立てて、一致したコードの時は一致してるコードの隣に値を転記。
内側ループを抜けた時点でフラグが立っていない場合はBにしか存在しない値なので、A表の最終行以降に転記
って考え方でいけました!

418:デフォルトの名無しさん
22/08/18 16:37:32.42 EfwMa2qS0.net
あ.A表に転記ではなくてC表ですね

419:デフォルトの名無しさん
22/08/18 18:49:57.27 AeknNWbaa.net
>>411,414
ありがとうございます、そのヒント元に自己解決できました
1. 対象となる期間を配列に格納
2. データを1つずつ0:00で分解、按分は都度[その日の時間/全体の時間]で実施
3. 配列内の一致する日付に割振り
4. 2-3ループ

420:デフォルトの名無しさん
22/08/18 20:46:21.25 JMDQexcx0.net
>>415
102は一致する相手がいないけど、転記される必要があるのかな?
ぱっと思いつくのは
ポインタをrとsの2つを用意してr=1, s=1から始める
1. Cells(s, 1) == Cells(r, 1) の間だけ s を進める。
2. Cells(s, 1) の値が変わったところで
a) s - r > 1 なら Cells(r, 1) を転記しながら s に追いつくまで r を進める
b) s - r == 1 なら転機せずに s に追いつくまで r を進める
3. 1からの手順を表の最後まで繰り返す

421:デフォルトの名無しさん
22/08/18 22:39:41.60 MNMwm62Z0.net
>>420
相手がいない場合も転記です
そのやり方試してみます
単純そうでむずかしい…

422:デフォルトの名無しさん
22/08/19 01:11:58.45 OSKKwF+I0.net
>>415
そこからどういうデータを求めたいんだ?
単に重複データ削除するだけで良い気がするんだが

423:デフォルトの名無しさん
22/08/19 07:58:47.24 YEGDOEOJ0.net
>>422
上下一致してるものだけ足し込んでいくということをしたいです
一致してなくても一個だけのはそのまま転記したい
空白は無視で
単純なコードでいけるかなと思ったら難しくて、、

424:デフォルトの名無しさん
22/08/19 09:33:47.59 TD6yT77i0.net
まずどういう出力か書けよ
頭悪すぎだろ

425:デフォルトの名無しさん
22/08/19 10:55:40.42 agk3kSn7p.net
>>424
>>423で説明すているだろ
これで分からないってお前白痴か?

426:デフォルトの名無しさん
22/08/19 11:00:49.57 0SH6JCsd0.net
>>415の入力例で言うと
100は上下で一致してるから転記する
101は上下で一致するからこれも転記する
>>421の説明だと102単独でも転記する
転記しない入力例ってどんなのよ?

427:デフォルトの名無しさん
22/08/19 11:05:43.32 nezaNaBad.net
423の足しこんでいくというのは?もう何もわからない

428:デフォルトの名無しさん
22/08/19 11:07:12.98 nezaNaBad.net
転記?今日の天気?
Excel必要ですか

429:デフォルトの名無しさん
22/08/19 11:32:50.63 LZdSBpbV0.net
うるせえ!この禿!

430:デフォルトの名無しさん
22/08/19 13:14:47.90 aeNJth6k0.net
まず髪の毛緑に染めてこい

431:デフォルトの名無しさん
22/08/19 13:37:04.21 NSoYBxeid.net
質問する側がおかしいと(どういう結果にしたいかが不明の場合)回答する気も失せるよね上下一致と言われたら
A
B
C
D
ならBを基準にA=BかつB=Cって自分はするんだが違うんだろ?

432:デフォルトの名無しさん
22/08/19 16:42:31.05 TM0tepDc0.net
重複除去したいって解釈してた

433:デフォルトの名無しさん
22/08/19 17:14:26.61 OSKKwF+I0.net
>>423
最終的に欲しい形を書け
エクセルの機能に重複データの除去ってあるのはしってるのか?

434:デフォルトの名無しさん
22/08/19 19:41:03.51 LZdSBpbV0.net
知らないのでわ?

435:デフォルトの名無しさん
22/08/19 19:54:20.05 fs7pDiUMd.net
足しこむとか転記とか何がしたいか意味不明なんだよね
単純にいま記載されている列の値について
1.同じ値が続く場合は最初の一つだけ残す
2.ただし途中にある空白は無視する(1、空白、1は同じ値が続いてるとする)
3.最終的に残した値で詰める または 残した値は別の列なりシートなりに転記する
みたいな事をやりたいのか質問見ただけではわからんのよね
この場合なら検索する行とセットする行を用意すれば簡単にできる話なんだけどね
仕事もそうなんだけど説明が下手な人ってやっぱり仕事もできない人が多い

436:デフォルトの名無しさん
22/08/19 20:23:56.98 uBoRK/pGd.net
足し込むというのが加算という意味であれば必然的に数値ということになるけど、、、
上の行と同じ数値なら足し算する=2倍するってことか?
それとも上と下の行が同じ数値なら現在行と上下の3行の和にするってことか?
なんかいろんな解釈ができる要望なんよね。。。

437:デフォルトの名無しさん
22/08/19 22:10:12.43 zQKwV5nn0.net
まぁ重複したデータを足し込むのか削除するのかはさした問題ではない。
ディクショナリやコレクションに元にあった値をキーにして
まずキーと同じ値をキーに該当する値として設定して、
同じキーが次回来たときに無視するか足し込むかすればいいだけの話だからな
最後にそれをシートに展開すればいいだけの話。
そうしとけば足し込もうが重複削除だろうが簡単に対応出来る。
SQLを知っているならSQLでやってもいい。
問題は同じ値が飛び石で来る可能性があるのかということ。
例えば101、101、102、101の順序で来ることがあるのか?
この場合、要件としては「上下で一致しているものだけ足し込む」ということなので上の例で言えば202、102、101と設定されるのが正ということになる。
これは上記した方法でやるのはかえってまどろっこしい。
そうしたら上から舐めてコレクションに値を格納、前回の行と次の行の頭が同じなら無視するか足し込むかすればいいし、値が違うならそのままコレクションに追加すればいい。
最後にそれをシートに展開する。
このように同じ数値が飛び石で来るかで作りがガラッと変わってしまう。せめてそこだけでもハッキリさせてくれれば。

438:デフォルトの名無しさん
22/08/20 00:10:31.82 KYv4qV6Cd.net
もう終わった話なんだと思うけど正直質問する人はこういうデータをいじりたいという事は伝えても
結果としてこういうものが欲しいっていう事を伝える人が少ないんだよね
だからいろんな解釈ができるからその辺もちゃんと情報を伝えてほしいわ

439:デフォルトの名無しさん (ワッチョイ ffda-tEjH)
[ここ壊れてます] .net
そういうの含めて個人の能力

440:デフォルトの名無しさん
22/08/24 18:51:09.99 VyM585LM0.net
Unique関数の引数って二次元配列じゃないとだめなの?

441:デフォルトの名無しさん
22/08/24 19:20:17.01 lK4e5BLcM.net
Range型を渡すんじゃダメなの?

442:デフォルトの名無しさん
22/08/24 20:13:49.71 LO0U8Jrb0.net
実際に試してみれば答えが出ると思うのだが

443:デフォルトの名無しさん (ワッチョイ 1fce-tEjH)
[ここ壊れてます] .net
マニュアル読め

444:デフォルトの名無しさん (ワッチョイ 9fda-iK0u)
[ここ壊れてます] .net
MSヘルプですね~

445:デフォルトの名無しさん
22/08/28 22:27:57.16 uLwcj+rg0.net
excel2019
win10
設定シートに各項目を入力させたらそれに応じて別シートに計算結果を入力させるVBAを書いてる途中なのですが、
VBAソースを書いてる途中に設定シートにこんな数値も持たせたい、
入力画面のレイアウトをあれこれ変えたいと行や列の挿入をしたくなってしまうのですが
そうするとVBAソースの方がずれたままになってしまうのですが、シートに挿入をしたら
それにともなって既にかけている部分だけでもソースコードのcellsやrangeの値が更新されてくれたりしないでしょうか?

446:デフォルトの名無しさん
22/08/28 22:36:45.40 bZvgSFoz0.net
>>445
参照先は自動更新されない
セルに名前を付けてその名前で参照すればよい

447:デフォルトの名無しさん
22/08/28 22:37:28.82 z6hd8oqM0.net
名前付きセル範囲
URLリンク(thom.hateblo.jp)

448:デフォルトの名無しさん
22/08/29 20:34:19.97 6xba6Hkk0.net
おまいらが毛がどうのこうので喜ぶがらマジで頭ツルッツルにしてきたぞ

449:デフォルトの名無しさん
22/08/29 22:48:42.98 Qu5uun0od.net
>>445
コレクションに格納するのが攻守最強

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)


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

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