Excel VBA 質問スレ Part72

レス数が1000を超えています。これ以上書き込みはできません。
2021/07/18(日) 08:42:15.37ID:KskL7bEXd
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ

※前スレ
Excel VBA 質問スレ Part70
https://mevius.5ch.net/test/read.cgi/tech/1616072923/
Excel VBA 質問スレ Part71
https://mevius.5ch.net/test/read.cgi/tech/1621914481/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/09/01(水) 04:48:15.65ID:vx5cHFWE0
ユーザーフォームから
A1に数字が入力され
B1からB7まで同じく数字が入力され
A1が月で、B1〜B7を日として
C1〜C7に月日として表示したいのですが

  A  B  C  D  E ・ ・ ・
1 8 12 8/12
2   13 8/13
3   14 8/14






上記、票のようにA1とB列に分割された月日を
C列に日付にできるでしょうか?

いつも質問ばかりで恐縮ですが
ご教授おねがいします
2021/09/01(水) 07:48:40.08ID:QyYX1GEf0
>>782
それぐらいなら関数でいいんじゃねーの
=DATE(YEAR(TODAY()),$A$1,B1)

年も入力しないとおかしくなる
「今年」を基準にすると、来年開いたときにデータ変わる
2021/09/01(水) 09:23:39.06ID:Uj8mUWALM
12月ぐらいに来年の1月のデータを入力しようとして日付だけ入力して今年の1月になっちゃってたってのは割りとあるある
2021/09/01(水) 10:18:49.87ID:uNhFH8V1d
>>783

> >>782
> それぐらいなら関数でいいんじゃねーの
> =DATE(YEAR(TODAY()),$A$1,B1)
>
> 年も入力しないとおかしくなる
> 「今年」を基準にすると、来年開いたときにデータ変わる

ご教授ありがとうございます
上記でやってみたのです
セルに前の値が残ってしまいます
1回目は9/10、9/11、9/12と表示され
うまくいくのですが
2回目に空白になったセル例えば9/10だけ
表示してほしいのですが他のセルもデータが残ってしまいます
クリアしたいのですが方法が分からず
VBAで制御したほうがいいのでしょうか?
何かいい方法はないかと思案してます
2021/09/01(水) 10:20:20.08ID:ufGoj8xi0
年には言及無いし
C1に「= A$1 & "/" & B1」これ入力して下へずらっとでいいんじゃないの
2021/09/01(水) 10:22:29.22ID:ufGoj8xi0
>>785
どこが空白か
何が残るか
2021/09/01(水) 10:56:06.92ID:RCZPpxX+a
月かわるんかい
じゃ新しい月になった時にどういう処理してるかも書かにゃ答えようがないぞ
2021/09/01(水) 12:13:19.29ID:uNhFH8V1d
月をまたぐ事はないので
2021/09/01(水) 12:15:18.01ID:uNhFH8V1d
今出先なので家に帰ったら皆さんが
わかりやすいようにご説明したいと思います
言葉足らずなご説明で大変申し訳ありません
2021/09/01(水) 13:29:51.12ID:MIZAw2OB0
なにがやりたいかよくわからんが、日付として取り扱わないほうがいい気がするなぁ
単純に文字列として連結しといたほうがいいかもしれん
2021/09/01(水) 16:29:17.25ID:zi3lAKaz0
698です お礼が遅くなってすみません
>>718さんの内容でほぼほぼ実現出来ました
その節はありがとうございました


Selectionを使っていた時に比べスピードもかなり上がりました
データ数100万程で5秒くらいです

ただ一部のファイルで元々設定していた表示形式が数値へ置き換わってしまい悩んでいます
例えば0010→10など
浅知恵でTextやCStrを使えばどうにかなるかと思いましたがダメでした
2021/09/01(水) 17:31:57.00ID:xpLasvJBM
VBAからIEを操作するプログラムが
Windows11にしたら動きません

というのは周知の事実ですか?
2021/09/01(水) 17:40:04.10ID:xpLasvJBM
ひとまずNavigateでURLを開くのはイケますが
Document.readyStateを上手く拾えないので操作しようがないですね
795デフォルトの名無しさん (ワッチョイ aeda-HBgv)
垢版 |
2021/09/01(水) 17:43:07.67ID:AF6jYwWs0
>>793
セキュリティーを考えればそれが普通じゃね
2021/09/01(水) 17:43:57.36ID:oM9EKr7Vd
>>782
お前、ここは何のスレだと思ってんの?
馬鹿すぎる奴は書き込むな
2021/09/01(水) 17:46:56.00ID:xpLasvJBM
>>795
互換モードをedgeは載せているのだから動くものかと
2021/09/01(水) 18:08:06.29ID:vx5cHFWE0
下記のように反映された後
  A  B  C  D  E ・ ・ ・
1 8 12 8/12
2   13 8/13
3   14 8/14






2回目以降、B2〜B3を消去して出力すると
  A  B  C  D  E ・ ・ ・
1 8 12 8/12
2      4/30
3      4/30
4 




4/30と出力されます
4/30を自動でクリアして空白にしたいのですが
いい方法が思いつきません
ご教授おねがいします
799デフォルトの名無しさん (ワッチョイ 4510-jtj7)
垢版 |
2021/09/01(水) 18:09:47.36ID:kYWyELeA0
>>798
いい加減にしろ
2021/09/01(水) 18:34:36.51ID:rcR5Gl32M
>>798
クリアしたあとDoループでB列が空白の場合はループを抜けるとかじゃダメかい?
2021/09/01(水) 18:59:14.96ID:sD7Rqgd1M
じゃあ現実的な代替案はどうですか?
ユーザー様にSeleniumドライバーのインストールと逐次更新をお願いするのは避けたいです
2021/09/01(水) 19:08:28.99ID:n24W6MuYM
>>798
C1: = IF(B1 = "", "", A$1 & "/" & B1)
これ入力して下へずらっとでいいんじゃないの
2021/09/01(水) 19:09:36.61ID:V21gvc28M
B列が空ならC列も空にする
2021/09/01(水) 19:36:37.25ID:QyYX1GEf0
>>792
>>721を改造

Sub Macro6()
Application.Calculation = xlManual
Application.ScreenUpdating = False
myAddress = Split(Selection.SpecialCells(xlCellTypeFormulas, 23).Address, ",")
For Each EE In myAddress
Range(EE) = Range(EE)
Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub


変えたのは
Range(EE) = Range(EE)
だけ。これで多分いけるとおもうけど、どうだろう
2021/09/01(水) 19:38:47.95ID:QyYX1GEf0
cells(1,1)=cells(1,1)
って暗黙の型変換で
cells(1,1).value=cells(1,1).value
になっているとおもったけど違うのね
2021/09/01(水) 19:56:12.78ID:zi3lAKaz0
>>804
実行すると対象セルが全て空白になってしまいましたw
2021/09/01(水) 20:21:01.01ID:QyYX1GEf0
>>806
どういうセルがあるの?

例えば、
="0"&1
だと
01
という文字列が残るんだけど
俺は365だけど、バージョンによって挙動が変わるのかもしれない。あんまりナイキはするけど
2021/09/01(水) 20:25:24.16ID:vx5cHFWE0
>>802

> >>798
> C1: = IF(B1 = "", "", A$1 & "/" & B1)
> これ入力して下へずらっとでいいんじゃないの

ありがとうございますm(_ _)m
早速試してみます
2021/09/01(水) 20:53:46.87ID:vx5cHFWE0
C1: = IF(B1 = "", "", A$1 & "/" & B1)

B列に文字が入力された場合
文字がそのままC列に表示されれば
完璧なんですが
難しいでしょうか?
2021/09/01(水) 20:56:51.38ID:QyYX1GEf0
>>809
C1: = IF(B1 = "", "", B1)

2021/09/01(水) 20:58:57.68ID:zi3lAKaz0
>>807
別のシートからマスタのコードをTEXT関数、表示形式指定(例えば"00000")で表示させてるような状態です
計算結果→02010に>>721を実行すると2010(数値)、>>804を実行すると空白になってしまいます
今使っているのは2016ですが365環境もあるので後ほど試してみます

.Copyと.PasteSpecial xlPasteValuesで高速化できる方法があったりするのでしょうか
こちらに書き込む前に
For Each SC In Selection
SC.Copy.
SC.PasteSpecial xlPasteValues
で試した際は自力コピペしたほうがよっぽど早くてどうしようもありませんでした
2021/09/01(水) 21:28:52.21ID:zi3lAKaz0
>>807>>811

例えば、
="0"&1
だと
01

別シートに打ち込んで実行したところたしかに空白にならず文字列で表示されました
ただ
="0"&1
="0"&2
="0"&3
の3行で実行すると全て消えて空白です…
2021/09/01(水) 21:42:45.23ID:WLDLOoPA0
>>806
>>805
valueプロパティの値がコピーされた感じかw
2021/09/01(水) 21:44:13.89ID:zi3lAKaz0
>>812
連投すみません

3セルのうち
="0"&1

="0"&3
を選択すると文字列表示になりました

="0"&1
="0"&2

="0"&4を選択すると1と2は消えて4だけ文字列で残ります…
2021/09/01(水) 21:45:19.70ID:RPMibrUxM
>>809
C1: = IF(ISTEXT(B1), B1, A$1 & "/" & B1)
2021/09/01(水) 22:25:27.20ID:QyYX1GEf0
>>812>>814

Sub foo2()

Application.Calculation = xlCalculationManual ' 手動計算にする
Application.ScreenUpdating = False ' 描画を停止する

For Each sc In Selection.SpecialCells(xlCellTypeFormulas, 23)
sc.Value = sc
Next sc

Application.Calculation = xlCalculationManual ' 手動計算にする
Application.ScreenUpdating = False ' 描画を停止する

End Sub

これの
sc.Value = sc
の部分を
sc.Value = sc.value

sc=sc
など色々試したが、上記がうまくいった
なお一体どういう型変換が行われているのかまるでわからない模様
2021/09/01(水) 22:52:06.46ID:h29OAeAi0
>>816
型指定宣言していないため、Forで指定するSCがVariant型
なので、SCはVariant(Rangeとは限らない…配列の1要素目みたいなイメージ)
ただ、SC.ValueとするとSCはRangeと明示されるのでそういう動きになる

んじゃないかなぁ
2021/09/01(水) 23:29:26.76ID:2gcT+4EJ0
IE問題どうするかなぁ
2021/09/01(水) 23:36:24.86ID:zknSVFy00
VBA止めるいいきっかけじゃん
2021/09/01(水) 23:42:06.70ID:KwKwZOB6d
>>818
なくなるのはアプリ
コンポーネントは残ると明言されてる
でもコンポーネントをウィンドウに貼り付ければ簡単にアプリが完成してしまう
2021/09/01(水) 23:55:13.89ID:QyYX1GEf0
>>818
まあlそのうち誰かがなんとかするやろ
2021/09/01(水) 23:58:40.93ID:lmopnPTl0
ちゃんとしたシステム入れればいいだけ
2021/09/02(木) 00:17:40.36ID:vUCj94gS0
ちゃんとしたシステム(爆笑)
2021/09/02(木) 00:50:02.40ID:PlnEFAD30
>>814
まとめるとこういうこと?
Sub Macro7()
Application.Calculation = xlManual
Application.ScreenUpdating = False
myAddress = Split(Selection.SpecialCells(xlCellTypeFormulas, 23).Address, ",")
For Each EE In myAddress
Range(EE).Copy
Range(EE).PasteSpecial xlPasteValues
Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
2021/09/02(木) 06:01:59.22ID:pGyB2U1O0
>>815
> >>809
> = IF(ISTEXT(B1), B1, A$1 & "/" & B1)

C列に無事、日付が表示されB1が文字列ならば
文字が表示されたのですが
2回目以降
例えば1回目の入力でB列に
 B
9/2
9/3
9/4
9/5

上記のように表示した後に2回目にB2に終了日の文字列を入力し再表示したら
 B
9/2
終了日
9/
9/

上記のようにB3以降にA1の値が反映されてしまいます
2回目以降B列が空白であれば空白にしたいのですがむずかしいでしょうか
2021/09/02(木) 06:17:15.44ID:8TUhFQ840
>>825
「○○であれば○○としたい」って言語化出来ているのであればあとはIf文で判定するだけでどうにかなるはずだよ
一回自分がやりたい事を頭からケツまでしっかり書いてフローチャートを作ってみた方がいい
○○であれば○○としたいの時には当てはまらない場合はどうするかもしっかり書くことを忘れずにね
2021/09/02(木) 06:20:57.63ID:pGyB2U1O0
連投で申し訳ありません!
言葉たらづですいません。結局わたしがやりたいと思ってるのは
A1に数字を入力
B1〜B2に数字を入力するとC列に結合た日付を表示しされる下記のような表です

  A  B  C
1 9  2 9/2

2    5 9/3

3      9/4

4      9/5

ただB2に文字列が入力されたらC2に文字列が表示され
C3以降は空白になってくれればいいのですが
2021/09/02(木) 06:25:01.18ID:pGyB2U1O0
下記コードをここでお教えいただきもう少しで出来そうなのですがわたしにはむずかしすぎて

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo err

'B1B2じゃなければ終了
If Intersect(Target, Range("B1:b2")) Is Nothing Then Exit Sub

'とりあえずクリア
Range("C1:C100").Clear

'メイン。整数じゃなければerrに飛んでコピーして終わり。trycacheみたいな事がしたかった
最初 = Cells(1, 2)
最後 = Cells(2, 2)
'
If (Int(最初) = 最初 And Int(最後) = 最後) Then

行 = 1
For i = 最初 To 最後
Cells(行, 3) = i
行 = 行 + 1
Next

Exit Sub
End If

'整数以外
err:
Range("C1:C7").Value = Range("B1:b2").Value

End Sub
2021/09/02(木) 06:57:24.18ID:pGyB2U1O0
間違いました!
A1に数字を入力
B1〜B2に数字を入力するとD列に結合た日付を表示しされる下記のような表です

  A  B  C    D
1 9  2  2   9/2

2    5  3   9/3

3       4   9/4

4       5   9/5

ただB2に文字列が入力されたらC2に文字列が表示され
C3とD3以降は空白になってくれればいいのですが
2021/09/02(木) 07:37:19.92ID:O3nuwBcWM
>>818
何か面白いことがわかったら教えて
2021/09/02(木) 07:53:36.77ID:8TUhFQ840
>>829
(クリア処理)
If IsNumeric(Range(″B1”).Value) And IsNumeric(Range(“B2″).Value) Then
Dim TgtAry() As String
ReDim TgtAry(0 to Range(”B2”).Value - Range(”B1”).Value, 3 to 4)

Dim AryCnt As Long
For AryCnt = 0 to Ubound(TgtAry, 1)

TgtAry(AryCnt, 3) = CLng(Range(”B1”).Value) + AryCnt
TgtAry(AryCnt, 4) = Range(”A1”).Value & ″/″ & TgtAry(AryCnt, 3)

Next

Range(Cells(1, 3), Cells(1 + Ubound(TgtAry, 1), 4).Value = TgtAry

End If
832デフォルトの名無しさん (アウアウウー Sa85-HBgv)
垢版 |
2021/09/02(木) 09:40:00.71ID:lpxNteAka
もうあきた
2021/09/02(木) 09:50:07.01ID:S+z0tXCPd
>>831
ありがとうございますm(_ _)m
家に帰ったら早速試してみます
2021/09/02(木) 10:17:54.51ID:61uHr+ZW0
>>829
どんどん条件追加してんじゃねーよw

一旦最初から最後まで説明する感じで整理してみて
2021/09/02(木) 10:23:41.27ID:61uHr+ZW0
とりあえず>>827の条件
C1に入力して下にずらっとしてみて
= IF(ISTEXT(B6), B6, IF(B6 = "", "", A$1 & "/" & B6))

ただしBのセルを空白にするのは手動

>>829のC列は何やねん?
2021/09/02(木) 11:39:09.52ID:S+z0tXCPd
>>835
すいません!
コードの基本的なところを教えてもらえれば
あとは自力で何とかしようと思ったのですか
思ったより難しくて(泣
2021/09/02(木) 12:26:07.30ID:Lpp+cK/ya
もおお面倒くせええ
最初ユーザーフォームがどうとか言ってたろ? そっちの管理者に言うのが手っ取り早いんじゃないの、まさか自作じゃあるまいし
2021/09/02(木) 12:47:54.81ID:jQ7od4vmd
月と日の範囲らしき値をいれるようだが日だけチェックするとかが意味わからないんだよね
それと今まで教えてもらったコードが実際に何ができるかわかならければ今後も同じような質問ずっとするのかな
2021/09/02(木) 13:06:30.53ID:PlnEFAD30
質問者は分散して書き込まれたわけのわからん条件を再度まとめて書いてくれないかな
文章力がないようだから番号を振って箇条書きがいいと思うよ
そこから仕切り直し
2021/09/02(木) 13:44:53.64ID:S+z0tXCPd
わかりました!
すみません
2021/09/02(木) 14:04:46.60ID:jQ7od4vmd
>>840
今までの経緯を見た感じだと単純な要件は
・A1には月、B1には開始日、B2には終了日が設定される
・C列には設定された開始日と終了日を使って開始日〜終了日の値が列挙される
・D列には設定された月とC列の値を使って日付が列挙される ※単純に月/日の文字列でよいのか(年を考慮した日付でなくてよいのか)
まずこれだけの要件であれば
>>828で関数などを使わずにD列の設定を追加すればよい(Cells(行, 4) = CStr(Cells(1, 1))&"/"&Cells(行, 3))
初期化の検討も関数がなくなれば「とりあえずクリア」の範囲をC1:D100にでもすればよい
エラーについては関数がなくなれば今のままでも要件を満たすのでは
842デフォルトの名無しさん (ワッチョイ 6e8e-CEQY)
垢版 |
2021/09/02(木) 16:20:28.02ID:tb5mIgdu0
>>840
お前、いい加減にしろや
2021/09/02(木) 16:37:31.01ID:61uHr+ZW0
>>829
B2に文字列が入力された時D2がどうなるかが無い
2021/09/02(木) 16:56:20.51ID:61uHr+ZW0
>>840
A1 月
B1 開始日
B2 終了日 (文字列の時もある)
C列 B1からB2の連番 C1は常にB1 (B2が文字列ならそれをC2へ、以降空白)
D列 月/日 D1は常に開始月/日 (C2が文字列ならそれをD2へ?、以降空白)

でいいなら

C1 = B1
C2 = IF(ISTEXT(B2), B2, IF(ISTEXT(C1), "", IF(C1 + 1 <= B$2, C1 + 1, "")))
D1 = A1 & "/" & C1
D2 = IF(ISTEXT(C2), C2, A$1 & "/" & C2)

C2とD2は下にずらっとね
2021/09/02(木) 17:33:27.50ID:pGyB2U1O0
>>831
自分のコードとどう組み合わせていいのかわかりませんでした
エラーになってしまい自分には無理そうです
もう少し勉強して出直したいとおもいます
本当にありがとうございます
2021/09/02(木) 17:40:30.06ID:pGyB2U1O0
>>841
明瞭な説明ありがとうございます
とりあえず業務上で必要なところは日付問題だけなので
それさえ解決できれば今後はなんとかなりそうです
2021/09/02(木) 18:06:17.19ID:jQ7od4vmd
>>846
こんな感じでいいんじゃないの?
Private Sub Worksheet_Change(ByVal Target As Range)
'B1B2以外は終了
If Intersect(Target, Range("B1:B2")) Is Nothing Then
Exit Sub
End If
'クリア
Range("C1:D100").Clear
'開始日のチェック
If CheckValue(Cells(1, 2)) = False Then
Cells(1, 3) = Cells(1, 2)
Cells(2, 3) = Cells(2, 2)
Exit Sub
End If
'終了日のチェック
If CheckValue(Cells(2, 2)) = False Then
Cells(1, 3) = Cells(1, 2)
Cells(2, 3) = Cells(2, 2)
Exit Sub
End If
'開始日から終了日を設定
nRow = 1
For nValue = Cells(1, 2) To Cells(2, 2)
Cells(nRow, 3) = nValue
Cells(nRow, 4) = Cells(1, 1) & "/" & nValue
nRow = nRow + 1
Next
End Sub
2021/09/02(木) 18:06:38.29ID:jQ7od4vmd
Private Function CheckValue(ByVal aValue As String) As Boolean
For nLoc = 1 To Len(aValue)
If InStr("0123456789", Mid(aValue, nLoc, 1)) = 0 Then
CheckValue = False
Exit Function
End If
Next
CheckValue = True
End Function
2021/09/02(木) 18:06:56.77ID:1Fx06KPw0
まじでこんな仕様を業務で使ってんの?
2021/09/02(木) 18:13:18.91ID:24Y/Debo0
Range型に入れられるものを変数に入れず処理するのほんと嫌い
Cells(1,1)=2 とか
せめて行と列をLong型の変数にしてやってあげて
851デフォルトの名無しさん (ラクッペペ MM66-sNgg)
垢版 |
2021/09/02(木) 18:40:44.69ID:95p8ZRX9M
>>849
日付の列だけあればいいよな
見た目は書式でどうとでもなるし
2021/09/02(木) 19:39:27.31ID:vUCj94gS0
>>849
ここは日本やぞ
2021/09/02(木) 20:22:46.11ID:JA6Fm57Z0
散布図において、点と点を結ぶ直線の色を、その系列の系列名参照先セルの背景色と同じ色に一括で変えるコードを教えてください。
背景色が設定されてない場合は色は変更しなくて良いです。

例えば下記画像のデータと散布図があるとします。
B1:E1セルの背景色を赤色に塗って、F1:G1セルの背景色を青色に塗ってマクロを実行すると、散布図の直線のうち、#1から#4が赤色に変わり、#5、#6が青色に変わり、#7以降はそのままの色を維持するようにしたいです。

https://i.imgur.com/lLWaKl2.jpg
https://i.imgur.com/Pdf7drp.jpg

系列が莫大な数のグラフだと設定から一つずつ色を変えるのは大変なので自動化したいです。
よろしくお願いします。
2021/09/02(木) 21:07:03.00ID:pxeaKQvs0
質問スレなのにコード全てを教えてもらおうとするのはいかがなものかね
ある程度自分コード書いてここが分からないとかならわかるが
2021/09/02(木) 21:24:04.85ID:DFz3pANA0
でも>>1で作成依頼もOKって書いてるしなあ
2021/09/02(木) 21:26:06.23ID:LsFuz3WEH
>>853
ほい
ワークシートの中にグラフが1つしかないこと、全データがグラフに使われていることが条件

Sub Macro1()
  ActiveSheet.ChartObjects("グラフ 1").Activate
  For k = 1 To Cells(1, Columns.Count).End(xlToLeft).Column - 1
    c = Cells(1, k + 1).Interior.Color
    If c <> &HFFFFFF Then ActiveChart.FullSeriesCollection(k).Format.Line.ForeColor.RGB = _
               RGB(c Mod 256, Int(c / 256) Mod 256, Int(c / 65536))
  Next
End Sub
2021/09/02(木) 21:38:11.49ID:pxeaKQvs0
>>855
それはすまない
2021/09/02(木) 23:50:56.62ID:JA6Fm57Z0
>>856
ありがとうございます。
頂いたコードをちょっと改造したら出来そうです。
2021/09/03(金) 00:34:19.18ID:7VSa3gcD0
FullSeriesCollectionってなんだよ
動かねーw
2021/09/03(金) 04:25:34.03ID:kuvugUtS0
>>858
>>859
おめー、すごい本音と建前だな
そのギャップ、埋める必要はない
吐露したいときはあるからな
2021/09/03(金) 06:02:06.71ID:1mYCibIj0
>>844
試してみたら、なんとかなりそうです!
何度もご助言いただき
ありがとうございます
2021/09/03(金) 07:17:18.60ID:staQfXFI0
>859
検索した方が早いぞ
俺も知らないけど検索したら内容は秒で理解できた
https://docs.microsoft.com/ja-jp/office/vba/api/excel.fullseriescollection
2021/09/03(金) 13:32:27.55ID:LfmEXbOQ0
Bookを別名保存して配布用データを作成する場合に、.xlsx にしてそのファイルにVBAコードは存在しない状態にする方法はあるのでしょうか?
2021/09/03(金) 14:03:11.01ID:XbDGKeUz0
>>816>>824
どちらも求めている結果になりました
824は自分でも試してもエラーになっていたので助かりました
型変換でこんなにつまづくは思わなかった(未だに原理は理解出来ていない…)
ありがとうございました!
865デフォルトの名無しさん (ワッチョイ 878e-m4tS)
垢版 |
2021/09/03(金) 15:55:21.72ID:yaNRzQx30
>>863
全角文字の拡張子だからテキストファイルか何かにするのか?それとも単なる馬鹿か?
2021/09/03(金) 15:59:38.52ID:FrRqokaz0
>>865
寂しいの?
867デフォルトの名無しさん (ワッチョイ 471d-FHff)
垢版 |
2021/09/03(金) 16:58:35.16ID:w5919iNp0
フリーランスエンジニアになってからの年収推移を公開【現在年収1000万】
https://dev-memo.net/fleelance_1000/
【実体験】仕事ができない新卒エンジニアでも月収70万フリーランスになれる理由
https://off.tokyo/blog/shinsotu-engineer-free-lancer/
フリーランスエンジニアは年収900万円までは余裕!現役フリーランスエンジニアが徹底解説
https://flytech.work/blog/8142/
フリーエンジニアの平均年収!未経験が年収1000万円を超える方法とは?
https://shikin-pro.com/guide/18633
【コラム】フリーランスは本当に自由なのだろうか?
https://zenn.dev/cat2pgm/articles/42bb40bf121342
「月100万円」稼ぐ猛者も、副業を始めるIT人材が急増している真の理由
https://xtech.nikkei.com/atcl/nxt/column/18/01572/021900001/
フリーランスエンジニアになって月100万稼いだ話
https://comblog.net/2020/07/06/freelance-100/
素人からでも「まずは月収50万以上」を目指したい方向け【フリーエンジニア・コンサル】
https://aruto.org/freelance-consulting
フリーランスのエンジニアやるなら45歳までに貯金5000万円作れないと死ぬ説
http://uma66.hateblo.jp/entry/2019/04/07/153119
2021/09/04(土) 00:30:43.37ID:HdS4X7vy0
>>862
自宅で使ってるExcelが2010がFullSeriesCollectionをサポートしてないというオチを
wで表現してみたんだが
伝わらなかったようでスマン
2021/09/06(月) 00:46:52.30ID:bCHQ7Kl80
そこそこできるんだけど、これ中学生辺り相手に家庭教師したらいい小遣い稼ぎになるんでね
2021/09/06(月) 00:51:02.10ID:4OUEmuPid
家庭教師なんて大学生の仕事だぞ
オヤジは採用されない
2021/09/06(月) 20:55:48.09ID:NYbUbMGR0
ハイパーリンクを絶対参照で設定しているのだけど(ファイル移動に備えて)表示文字列がフルパスだと
表示しきれないのでここだけ相対参照で表示したい.
絶対参照から相対参照文字列を取得する関数はないでしょうか?
2021/09/06(月) 22:01:27.65ID:6VddzRoR0
。。。ラムダ関数の件どうなったの?
2021/09/07(火) 01:09:39.85ID:fgpBZKKDa
>>871
Perlで自作
2021/09/07(火) 10:00:10.71ID:wW3S0zCbM
>>871
split
2021/09/07(火) 10:23:08.20ID:LRYELwZL0
>>874
ヒントありがとう.
1,リンク元とリンク先のフィアル名以外のフルパスを区切り文字¥で分割する.
2,共通部分を除いたリンク元の文字列数の個数だけ”.\”を共通部分を除いたリンク先の文字列&ファイル名
であっていますか?

2の部分で個数を数える処理とかをスマートのやる方法ありますか?思いつくのが文字列を一つずつ比較して
異なると抜けるみたいみたいな処理がしか思いつかないんで.
2021/09/07(火) 10:23:56.54ID:p7djLIgl0
>>871
相対参照でも表示しきれないものはどうする気だ?
2021/09/07(火) 10:24:49.55ID:LRYELwZL0
間違えた
1,リンク元とリンク先のフルパスを区切り文字¥で分割する.
2,共通部分を除いたリンク先の文字列&ファイル名に共通部分を除いたリンク元の文字列数の個数-1だけ”.\”をつける
2021/09/07(火) 10:25:31.04ID:LRYELwZL0
>>876
そこまで深くないんで.
2021/09/07(火) 10:31:48.41ID:p7djLIgl0
相対参照への変換は動作が変わるので
表示だけ工夫することを勧めるよ
2021/09/07(火) 10:43:18.05ID:LRYELwZL0
>>879
> 相対参照への変換は動作が変わるので
→アドレスそのものは絶対参照のままにするので動作はかわらないと思います.
2021/09/07(火) 11:37:34.66ID:p7djLIgl0
>>880
以下どれかじゃ駄目なん?

(a)Tooltipでちゃんと表示して通常は切れたまま
(b)2行に分けて表示
(c)パスの先頭から何文字か + ” 〜(省略)〜 ” + ファイル名
2021/09/07(火) 13:38:20.09ID:7P2mUzTw0
それ、どこからの相対パスが欲しいんだよ?
自分自身から自分自身への相対パスなら、全部.\だから
たんにファイル名だけ表示させればいいんじゃね

汎用的に真面目な相対パスに変換しようと思ったら結構邪魔くさいな
まあこういうのは大概すでに誰かがやってる
VB.NETだが
https://dobon.net/vb/dotnet/file/getabsolutepath.html#pathrelativepathto
とか。API呼び出しでやる方法もそこにある
2021/09/07(火) 15:24:56.80ID:LRYELwZL0
>>881
表示だけでは絶対パスがわからないのでTooltipは必要ですよね。
表示をファイル名だけにするか、C のようにするかですけど、表示だけである程度場所が分かりそうな情報が表示されていると便利なので、相対パスもしくはそのファイルがあるフォルダー名のどちらかにします。フォルダーは存在位置をだいたい覚えてるもんですから。
884デフォルトの名無しさん (ワッチョイ 5ff2-nzYM)
垢版 |
2021/09/08(水) 14:22:30.46ID:pb/a0YKS0
D列〜H列の各4項目を印刷エリアのA列に配置して
それぞれ印刷がしたいのですが、下記でも出力されますが、
もっと簡略な書き方あったら教えてください。

Sub PrintOut()
Range("A1").Value = Range("D1").Value
Range("A2").Value = Range("D2").Value
Range("A3").Value = Range("D3").Value
Range("A4").Value = Range("D4").Value
ActiveWindow.SelectedSheets.PrintOut

Range("A1").Value = Range("E1").Value
Range("A2").Value = Range("E2").Value
Range("A3").Value = Range("E3").Value
Range("A4").Value = Range("E4").Value
ActiveWindow.SelectedSheets.PrintOut

(以下F列分〜H列分まで繰り返している)

End Sub
2021/09/08(水) 15:21:04.14ID:75/i6xmb0
>>884
offset 関数を使って I と J のループで回せば?
2021/09/08(水) 15:22:28.05ID:XlNVU0UMH
>>884
Sub PrintOut()
  Dim a
  For c = 4 To 8
    a = Cells(1, c).Resize(4, 1)
    Range("A1:A4") = a
    ActiveWindow.SelectedSheets.PrintOut
  Next
End Sub
2021/09/08(水) 16:25:02.09ID:XlNVU0UMH
処理する範囲をわかりやすくしてみた

Sub PrintOut()
  Dim a
  For Each c In Range("D1:H1") 'DからHまで
    a = c.Resize(4, 1) '縦4行
    Range("A1").Resize(4, 1) = a
    ActiveWindow.SelectedSheets.PrintOut
  Next
End Sub
2021/09/08(水) 16:25:12.58ID:W4cHTvUwd
すげー!凄い短くなってる!
ありがとうございます。
後で試してみます。

まだVBA初めて間もないのですが、しっかり勉行すれば、
繰り返し作業簡素化の可能性を非常に感じました。
ありがとうございました。
889デフォルトの名無しさん (ワッチョイ 7f8e-m4tS)
垢版 |
2021/09/08(水) 16:48:49.57ID:q+ZxDcv00
またいつものあいつに引っ掛かる馬鹿ども
2021/09/08(水) 17:49:01.52ID:I0eTwbNOM
って言いたいだけの自尊心の擬人化さん
891デフォルトの名無しさん (アウアウウー Sa8b-AvaG)
垢版 |
2021/09/08(水) 18:05:21.93ID:ehctv71ga
ねぇねぇワクチンが足りないとか余って捨ててるとかなんなの?
Excelでさえ1億2千万人のデータぐらい余裕で作れるんじゃないの?
2021/09/08(水) 18:33:49.98ID:lGj0x8DT0
with派は?
2021/09/08(水) 18:39:36.93ID:wkgfp7fUa
Excelの印象派はちょっと困るねぇ
セル結合じゃなくてシェイプでやってよ
2021/09/08(水) 19:58:14.37ID:y8J9pOw20
Excelではどうにも出来ないたぐいのヒューマンエラーが多いからな
2021/09/09(木) 09:38:25.14ID:foh10V2pM
たとえば5000行もある住所録(一人一行使う)で、左端(つまりA列)にチェックボックスをつけるって出来ます?
5000個もチェックボックスオブジェクトを作るって現実にやってる方います?これは現実的でしょうか?

今考えてるのはA列に正方形(□)とレ点付きの□の二択プルダウンを用意することなんだけど、
それだとマウスのダブルクリックで表示を切り替えることは出来なくなる。

良い方法ありますか?
2021/09/09(木) 09:59:04.73ID:4tB32NIbH
>>895
チェックボックスを5000個作るぐらい簡単だが?
けど、そういう一覧表を作る意味がないだろ

5000件も手作業でチェックなんか入れてたら絶対にミスが起きるし
次の作業のことまで考えて表を作れよ
2021/09/09(木) 10:11:27.57ID:zJmTPnJXM
>>895
チェックボックスみたいなテキストでやる
2021/09/09(木) 10:12:10.09ID:FIynLA9Dd
>>896
自分も同じことを思ったけど解決策にならないレスはせずに放置がいいと思う
理解していけばしていくほどやれることを絞って考えていくようになるかと
2021/09/09(木) 10:25:59.17ID:4jr1qQtOd
参考 チェックボックスの絵文字 使用は推奨しない

2021/09/09(木) 10:27:08.70ID:2Kg/wmz7M
>>895
ダブルクリックかライトクリックイベントで背景色変えるとかなんか印を付けるとかした方が楽そう
2021/09/09(木) 10:32:22.27ID:IpCo+OYQ0
>>895
普通にその方法でいいじゃんと思うけど、ダブルクリック必須なの?
チェックボックスの操作ならせめてシングルクリックだと思うけど。

マウス必須ならA列にハイパーリンクを仕込んでおいて、イベント
ハンドラの中でどこが押されたかを判断して状態を反転させるという
方法もある。

ただこの場合A列は自由に入力可能なのでシートの保護を掛けることに
なると思うし、どの部分をどこまで編集可能とするかということとの
兼ね合いになると思う。
2021/09/09(木) 10:42:39.73ID:9k5sY4oP0
>>895
あなたの言ってることはダブルクリックとかチェックボックスとプルダウンとか意味不明なんだけど、やりたいことさえはっきりしてなら VBA でオブジェクトの追加コマンドを追加場所を1行から5000行まで変えながら回せばいい。
2021/09/09(木) 10:48:23.02ID:4tB32NIbH
>>902
セルをコピペすればセルに乗ってるオブジェクトも一緒にコピペされる
だからチェックボックスを5000個に増やすだけなら数クリックの手間だけで終わる
ブックが重くなるけどな
2021/09/09(木) 10:50:53.75ID:foh10V2pM
シングルクリックと間違えてました。
自動的に5000個作ると30分待っても終わらないので、ダメなのだと思ってました
2021/09/09(木) 10:53:21.37ID:foh10V2pM
>>897
>>896
チェックを入れた行だけ特定の書式にしてファイルとして出力する用途なので、そこは気にしないのです
2021/09/09(木) 11:01:26.77ID:4tB32NIbH
試しにやってみたけど、チェックボックス5000個コピペだけなら20秒ぐらいで終わったぞ
https://i.imgur.com/4Bo9Yvp.png
2021/09/09(木) 11:03:58.28ID:foh10V2pM
>>906
1000個なら一分待てば出来ました。
しかしその後の操作がめちゃくちゃ重くなるのでこうした使い方は一般的ではないのかな、という疑問がありました
2021/09/09(木) 11:07:12.46ID:foh10V2pM
>>897
おさわがせしました。
1000個作って、特定行を一行削除するだけでもとても完了に時間がかかるので、
この方の方法でしのぎます
2021/09/09(木) 11:21:19.40ID:37zPgm1s0
>>907
ちなみにどんなふうに削除してる?
2021/09/09(木) 14:10:09.39ID:m7/bNtYYa
クラスモジュールの引数に可変長引数を渡したくて、呼び出し側でその引数に変数をぶち込んで渡したいんだけど、これってやっぱりできないの?
2021/09/09(木) 19:38:24.58ID:7gPjCFSp0
>>895
sheetモジュールに記述
※ただ、選択済みのセルをクリックしてon/offができない

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

d = WorksheetFunction.Unicode(Cells(1, 1).Value)
Debug.Print (d) ' 38960

If Target.Column = 1 Then
Target.NumberFormatLocal = WorksheetFunction.Unichar(10004) & ";□;0;@"

If Target.Value = 0 Then Target.Value = -1
Target.Value = Target.Value * -1
End If
End Sub
2021/09/09(木) 19:39:38.73ID:7gPjCFSp0
デバッグ残ってたわ。こっちで

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'A列のみ
If Target.Column = 1 Then
'書式設定を設定
Target.NumberFormatLocal = WorksheetFunction.Unichar(10004) & ";□;0;@"
'-1かけて反転させる
If Target.Value = 0 Then Target.Value = -1
Target.Value = Target.Value * -1
End If

End Sub
2021/09/09(木) 19:55:23.82ID:zfiF925t0
関連スレ建てたよ

VBAなんでも質問スレ Part3
https://mevius.5ch.net/test/read.cgi/tech/1631184381/
2021/09/09(木) 23:48:42.23ID:ULMewu8MM
>>910
delimiterで値を連結して一つの文字列にして渡し
それを受け取った側で処理するとかw
2021/09/10(金) 00:39:56.77ID:Ovs2Qwn/0
>>914
なるほど
無理やりすぎて草
2021/09/10(金) 00:57:16.66ID:cGWG4Dd90
>>910
ちょっとなに言ってるかわかんないけど
ParamArray とかそういうこと?
2021/09/10(金) 01:37:01.01ID:k/ICsAd30
>>910
恰好つけて内容端折ったり、初心者に有りがちなオレオレ用語使ってるせいで意味不明
ちゃんと質問したら回答や代案出してくれる人いると思うよ
2021/09/10(金) 06:29:18.76ID:SjJWgB1Wd
エスパーしてみるとオーバーロードしたいってこと?
2021/09/10(金) 07:09:26.44ID:LHgBQKs+0
>>910てParamArrayでいいじゃん(いいじゃん)
2021/09/10(金) 12:04:43.32ID:9zsJDEjAa
言葉足らずで申し訳ない


・クラスモジュールでtestSubを作る

・testSubには引数として複数の文字列(パス)を入れたいが、場合によってはいれる数が変わるので可変長引数として渡したい→paramArrayを使った

・標準モジュールでtestSubを呼び出すときに引数に文字列直打ちで入力→これは呼び出せた
例 class.testSub(“a”, “b”, ”c”) →OK


・一方で引数に参照渡し?で変数を入れることができなかった

Dim a as string:a = “a”
Dim b as string:a = “b”
Dim c as string:a = “c”

class.testSub(a, b, c) →エラー

まとめ:参照渡し+可変長引数を実現する方法はありますか?という質問です
921デフォルトの名無しさん (ラクッペペ MM3e-oWuh)
垢版 |
2021/09/10(金) 12:33:58.83ID:LPBZaVhNM
へー、どんなエラーメッセージが出るんだい?
2021/09/10(金) 12:41:02.44ID:s5UDpNf0d
bとcに代入されてないように見えるんだけど…
2021/09/10(金) 12:44:45.11ID:9zsJDEjAa
>>922
誤字りました


>例
>Dim a as string:a = “a”
>Dim b as string:b = “b”
>Dim c as string:c = “c”

>class.testSub(a, b, c) →エラー
2021/09/10(金) 12:44:47.75ID:Wgizc1rOd
paramarrayは使ったことないからなんでエラーになるか知らないけど

optional byrefをいっぱい作れば解決か?
2021/09/10(金) 12:57:26.48ID:3anmc9lr0
うちではエラーにならないので、ParamArray以外のところで何か起きていると思う
2021/09/10(金) 13:42:46.46ID:cGWG4Dd90
とりあえずエラーメッセージぐらい書け
Call class.testSub(a, b, c) とかいうオチじゃないだろうな
2021/09/10(金) 13:48:25.18ID:cGWG4Dd90
あと言っとくけど、参照型と参照渡しはちがうからな
その例でいくなら(受け取り側で何やりたいかによるが)参照渡しである必要性なんてないんじゃね
2021/09/10(金) 15:05:47.68ID:bX+CqFZ4r
vbaの配列って絶対要素数がわかってないとだめなの?
他の言語のリストみたいにあとから追加とか削除したいんだけど
2021/09/10(金) 15:09:49.67ID:kF1ZwEU6a
>>928
一々ReDimしなきゃならん
それは嫌って人のためにCollectionがある
2021/09/10(金) 15:16:50.98ID:tlapevkG0
二次元配列以外はコレクションでいいよな
2021/09/10(金) 15:22:02.18ID:kF1ZwEU6a
Dictionaryも好きだけどね
用途によるね
2021/09/10(金) 15:47:18.98ID:bX+CqFZ4r
>>929
まじかよ 
メモリ確保の問題かな?
これは大きな弱点やな
2021/09/10(金) 16:10:25.64ID:bX+CqFZ4r
配列が可変だったら終わる作業が全く終わらん
マジでいらつくわ
934デフォルトの名無しさん (ワッチョイ eaf2-GwBl)
垢版 |
2021/09/10(金) 16:26:30.74ID:rHUFiRNt0
>>886>>887
コンパイルエラー
変数が定義されていません

とか出たのですが・・・。
c のトコがハイライトされています。
2021/09/10(金) 16:31:21.74ID:8Iwa8KgHa
>>934
変数が定義されてないなら定義すればいい
2021/09/10(金) 16:31:29.22ID:2Fxd4w670
Set range = ActiveSheet.Range("J10")
debug.print range.Cells(0, 0).address
この出力がI9になります
J10を期待したのですがどういう事ですか?
2021/09/10(金) 16:36:53.08ID:8Iwa8KgHa
>>936
ActiveSheet.Cells(1,1).AddressはA1になるでしょ?
んで、ActiveSheet.Cells(0,0).Addressはオブジェクト定義エラーになるでしょ

つまり、ワークシートの起点はA1であり、Cells(1,1)なわけ
だから、それから今回の事象は推察できるでしょ

余談だけどその変数名は絶対にやめた方がいい
VBAには既にRangeって単語があるんだから
2021/09/10(金) 16:41:57.41ID:8Iwa8KgHa
>>936
追記
あなたの考えどおりに動く、offsetって関数があるからそっち使ったらいいんじゃないかな
2021/09/10(金) 16:42:03.28ID:tlapevkG0
>>936
1,1にすればなるだろ
0だから行列がそれぞれマイナス1されてるんじゃね?
0入れたことないから予想だけど
2021/09/10(金) 16:52:02.92ID:2Fxd4w670
>>937-938
Cellsの引数はそのまま1つ目2つ目と考える事にします
変数名は質問用に適当にしましたすみません
offsetが距離1つ先2つ先なのでこちらを使用しようと思います
ありがとうございました

>>939
1,1にすればなりますが論点はそこではありません
2021/09/10(金) 16:54:59.11ID:tlapevkG0
0から始まる配列なんかを入れたいという感じか
2021/09/10(金) 17:05:41.13ID:cGWG4Dd90
>>934
変数が全角と半角混在してんじゃね
つかコードそのまま張れよ
2021/09/10(金) 17:13:14.83ID:8Iwa8KgHa
>>942
cの宣言してないだけ
2021/09/10(金) 17:47:04.78ID:k/ICsAd30
>>920
下に書いたようにParamArrayを使ったメソッドが定義されたクラスモジュールを作って、
それに宣言した変数を渡してみたけどエラーは起きないよ。

後、「参照渡し」で有る事を気にしてるけど、ParamArrayが指定された引数は参照渡しになる。
例えばtestSub内でargs(0)に適当な値を割り当てると、呼び出し元のcaller関数のaの値も変わる。

クラスモジュール(class.cls)
Public Sub testSub(ParamArray args())
Dim arg
For Each arg In args
If VarType(arg) = vbString Then Debug.Print arg;
Next
End Sub

標準モジュール
Sub caller()
Dim a As String: a = "a"
Dim b As String: b = "b"
Dim c As String: c = "c"
Dim Class As New Class
Class.testSub a, b, c
'イミディエイトウインドウ: abc
End Sub

だからこっちが質問内容を取り違えてるんだと思うんだけど、どこが違う?
それとエラーメッセージを教えて欲しい
もし意味が分かるならコンパイルエラーか実行時エラーかも知りたい
2021/09/10(金) 18:37:19.42ID:k/ICsAd30
>>934
Columnsで列ごとに取り出す方法で短く、分かりやすくしてみた

Sub PrintOut()
Dim Column As Range
For Each Column In Range("D1:H4").Columns '指定範囲を一列ごと取り出す
Range("A1:A4").Value = Column.Value '取り出した一列の値をA1:A4に張り付ける
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub

ちなみにこういうのはActive***とセル番号指定じゃなくて、
シートモジュールとテーブル使った方がメンテしやすくなる。

A1:A4とD1:H4にそれぞれテーブルを作成(セルを選択して「ホーム」リボンの「テーブルとして書式設定」)し、
A1:A4のテーブル名を「コピー先」、D1:H4のテーブル名を「コピー元一覧」にする。
そのシートのシートモジュールに次の様なメソッドを定義する

Sub MyPrintOut()
Dim Column As ListColumn
For Each Column In ListObjects("コピー元一覧").ListColumns
ListObjects("コピー先").Value = Column.DataBodyRange.Value
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub

やってることは一緒だけど、
・コピペする(される)セルの番地が変わっても動く
・D1:H4の範囲が増えてもテーブルを範囲を変更するだけで動く
・「コピー元一覧」から「コピー先」に張り付けてるのがソースを見ただけで分かる
とメリットだらけ
2021/09/10(金) 21:16:37.69ID:cbJJzriEM
>>937
> 余談だけどその変数名は絶対にやめた方がいい
> VBAには既にRangeって単語があるんだから
なぜ?
VBAは型の名前空間と変数等の名前空間違うから問題なく動くぞ
2021/09/10(金) 21:38:37.34ID:2Fxd4w670
>>946
そういう問題じゃないんですよ
2021/09/10(金) 21:40:05.19ID:TT1mfVcaM
>>947
だからどういう問題かを書けないなら黙ってなよ
2021/09/10(金) 21:43:02.76ID:2Fxd4w670
>>948
動くかどうかという話ではないので論点はそこではありません
2021/09/10(金) 22:07:47.67ID:rk4qX9ha0
動かすだけならグローバルに配列つくればいいわな
2021/09/10(金) 22:16:10.75ID:cbJJzriEM
>>949
ああ説明できないのかしたくないのかは知らんけどそういうことしか書けないのな
まあ君はそれでいいと思うよw
2021/09/10(金) 22:19:16.50ID:rrgK5Yqx0
>>951
可読性の面もあるし、変数名の意味付けの面もあるだろう
Rangeって書かれても、どんな目的で何のRangeを変数に入れたのかが分かるように書くのが綺麗なコード
知らんけど
2021/09/10(金) 22:20:43.81ID:oDrMz70O0
難癖つけててワロタ
2021/09/10(金) 22:37:14.80ID:sbKq7iyBM
>>952
> Rangeって書かれても、どんな目的で何のRangeを変数に入れたのかが分かるように書くのが綺麗なコード
例えば指定された範囲にいくつかの装飾を適用する
Private Sub 装飾(Range As Range)
With Range
...
End With
End Sub
君なら引数の名前をどうする?
2021/09/10(金) 22:56:49.10ID:rrgK5Yqx0
Excelの装飾ってのがよくわからんけど、書式のこと?

関数っぽい書き方してるからこんなんでいいんじゃないの

Private Sub SetFormat_to_TargetRange(ByVal TargetRange As Range)
With TargetRange
...
End With
End Sub
2021/09/10(金) 23:04:12.45ID:k/ICsAd30
文脈的に明らかならRange As Rangeいいと思うけどね。

あと、「Rangeオブジェクト」である以上の情報がない変数や引数に対して無理やり名づけようとしても、
結局TargetRange的な抽象的な名前になっちゃう事もある。
2021/09/10(金) 23:06:14.39ID:k/ICsAd30
>>955
流石にそれは冗長すぎて逆に読みにくいだろ・・・
2021/09/10(金) 23:11:20.56ID:LHgBQKs+0
>>954
そこはtarget as rangeでいいと思う
一番読みやすい

自分しか使わない場合でもrange as rangeは使わないかな
vbaの場合、引数なしの関数と変数って見分けが付きにくい
ってかなんだこれエラーになるぞ

Sub foo()
Dim Calculate As Long
Calculate
End Sub

これはエラーにならない
Sub foo()
Dim Calculate As Long
End Sub

これもエラーにならない
Sub foo()
Calculate
End Sub

変数名と関数名がかぶると変数が優先される?
まぁ何にしろ、こんな事は避けたいから俺はかぶらないようにするけどね
2021/09/10(金) 23:15:36.34ID:rrgK5Yqx0
多少長くても要素要素は省いちゃメンテが大変になるから多少冗長でも構わないスタンスで

単語の簡素化はしてもいいなら関数名をSetFmt_TgtRngとかにするかもね

あとそもそも、挙げられた例は不適切では?
今回話題になってるのは呼び出し先の(汎用的に使える)関数での変数名ではなくて、呼び出し元での変数名かと
2021/09/10(金) 23:25:05.99ID:k/ICsAd30
>>958
再定義(シャドーイング)されてるだけ。
親スコープから継承されてる宣言名(今回で言えばオブジェクト名.Calculate)を再定義すると、定義が上書きされる。

Calculateは整数として再定義されたので、そのスコープではCalculateだけなら暗黙的に整数になる。
明示的に「オブジェクト名.Calculate」とすればメソッドとしてのCalculateを使用できる
2021/09/11(土) 00:00:09.96ID:qqZDVqkP0
personal.xlsbを複数の端末で共有したいので共有フォルダーにおいています.
XLSTARTのpersonal.xlsbは削除して共有フォルダーのpersonal.xlsbへのショートカットをおいています.
エクセルが起動するときにpersonal.xlsbを開くかどうか毎回聞いてきます
(セキュリティのマクロの設定は「警告を表示して全てのマクロを無効にする」です)

毎回開くを押すのが面倒なので共有フォルダーのpersonal.xlsbだけ常時開くような設定はできないでしょうか?
2021/09/11(土) 07:08:07.40ID:M0KgNEQw0
>>960
ありがとうございます
こんな機能あったのか、名前被るとエラーになると思って避けてたわ
2021/09/11(土) 08:32:29.27ID:uUbGGWZvM
>>962
スコープを持った言語ではたいてい内側のスコープが優先されるよ
中にはあえてエラーにする言語もあるけど
https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0136
2021/09/11(土) 09:37:25.87ID:3jGknNChp
>>955
関数の大きさにもよるな
小さくてすぐ上に引数設定して
型が見えてるようなのはvalueでいいと思う
少しごちゃごちゃして見辛いのは
targetRangeでいいと思うし
更にもう少し大きくなって業務的な
意味を持つようになったらその名前付ければ
いいんじゃないかな
2021/09/11(土) 10:18:08.93ID:JYcIgh+V0
>>936です
質問用に最少構成にする時点でもう少し変数名に気を付けるべきでした
変な流れになってすみません
2021/09/11(土) 10:49:48.68ID:eXg+YAmHM
>>964
Valueはないわ…
2021/09/11(土) 12:17:24.93ID:qqZDVqkP0
>>966
そうだよな。value指定ではフォーマット変更は無理だよな
2021/09/11(土) 13:14:28.26ID:GnKWsobMa
Valueだけはねぇわ
targetとtmpとi・j・kとrくらいしか意味の薄い変数は使わないようにしないと
2021/09/11(土) 13:57:33.58ID:SrjYrNmNM
m,nも
2021/09/11(土) 14:37:20.09ID:M0KgNEQw0
i・j・k

顔文字かと思った
2021/09/12(日) 11:12:03.90ID:up1UF/mUp
valueがダメだと言ってる奴は恐らくプロパティとか
プロパティの使えない他言語とか使ったことのない井の中の蛙という奴だな

VBAしかやってないジジイにはよくあること
2021/09/12(日) 11:42:37.67ID:igJhGb/40
>>971
君、韓国人?
2021/09/12(日) 11:48:24.82ID:3Dv8YdNb0
韓国をばかにするな!ITに関しては日本より進んでいるぞ
2021/09/12(日) 12:10:04.57ID:tsfiI8be0
どこ見て言ってんだか
2021/09/12(日) 12:15:32.69ID:3Dv8YdNb0
ここ見ててんだよ
2021/09/12(日) 12:55:49.25ID:xXC+mfefM
>>971
またチンケなマウント取りが来たなw
>>954の引数としてValueはないわって話
値としての用途ならValueもよく使うよ
2021/09/12(日) 13:36:49.25ID:5xdi3uAF0
オブジェクト型のRange型なのに、Valueを変数名にするのはVBAの常識的にNGなのは自明
2021/09/12(日) 14:09:17.30ID:3Dv8YdNb0
>>977

> Valueを変数名にする
変数名の適否ではなくって、ByValで値引き渡しにしたらもとの範囲のフォーマットを変更できないという話じゃないのか?
2021/09/12(日) 16:11:41.17ID:INS7ikYU0
>>978
今問題にしてたのは変数(引数)名であって引数の渡し方ではないのだが
参照型と参照渡しとちゃんと区別して理解してる?
2021/09/12(日) 16:21:24.92ID:aVK/EU7g0
元の元は>>936(私)でdim range as rangeに対してsetしたのですが
引数としてrange as rangeとされている状態でsetする事なんてあるのですか?
普通は無いなら途中から引数の話になるのもずれてません?
2021/09/12(日) 16:31:54.19ID:pHewVqE+0
そう言えばデコレーターパターンとかでは
valueはよく見るけどreferって見ないよね
なんでだろ?
2021/09/12(日) 16:37:26.61ID:3Dv8YdNb0
>>979
955の話じゃないのか?
誤解してたらすまん。
2021/09/12(日) 18:56:51.30ID:up1UF/mUp
>>981
それは引数が何かの値という意味で
プログラム的な参照とか値とかは関係ないからさ
2021/09/12(日) 19:28:40.93ID:qUARoTjRM
>>980
お前さんの普通がわからんけど、複数のレンジを返したいならそういうケースもあると思うよ
そもそも>>952は名前付けの話でSet云々の話に限定はしてないと思うし
985デフォルトの名無しさん (ワッチョイ a6ba-WYzC)
垢版 |
2021/09/12(日) 21:17:53.40ID:K6Dv6PKH0
ttps://whois.nic.ad.jp/cgi-bin/whois_gw?key=182.22.16.251&codecheck-sjis=%E3%81%AB%E3%81%BB%E3%82%93%E3%81%AD%E3%81%A3%E3%81%A8%E3%82%8F%E3%83%BC%E3%81%8F%E3%81%84%E3%82%93%E3%81%B5%E3%81%89%E3%82%81%E3%83%BC%E3%81%97%E3%82%87%E3%82%93%E3%81%9B%E3%82%93%E3%81%9F%E3%83%BC&submit=
に表示されているネットワーク名「YAHOO-NET」を取得しようとしているのですが、
Cells(1, 2) = objIE.Document.getElementsByTagName("pre").innerText
ではメソッドがサポートされいないとエラー表示されます。
何がいけないのでしょうか?
2021/09/12(日) 21:29:23.70ID:Nc1wnmSN0
普段使ってないから問題点がこれ意外にもあるかわからないが
Cells(1, 2) = objIE.Document.getElementsByTagName("pre")(1).innerText
これでどう?
2021/09/12(日) 21:29:29.14ID:wxf2x8Lb0
VBAとJavaScriptが、混ざっちゃった感じかな
988デフォルトの名無しさん (ワッチョイ 7935-xJJl)
垢版 |
2021/09/12(日) 22:10:03.90ID:UcZJH98c0
n時間後にエンターキーを押すプログラムってどう作るんだ?初心者にもわかりやすく誰か教えて
2021/09/12(日) 22:16:01.50ID:wxf2x8Lb0
「n時間後にアラームを設定して、鳴ったらENTERを押せ!」
と、命令する
990デフォルトの名無しさん (ワッチョイ a6ba-WYzC)
垢版 |
2021/09/12(日) 22:27:13.14ID:K6Dv6PKH0
>>986
ありがとうございます。
「オブジェクト変数がセットされていません」というエラーメッセージが出ており、検証はできておりませんが、いけそうな気がします。
ページ遷移したらobjIE.Documentに遷移先の情報が自動で設定されないのかもしれません。
2021/09/12(日) 22:28:25.73ID:8PbYCWHKH
>>988
基本はこうだけど、このままだとタイマーを仕掛けたのを忘れてて、ほかの作業をしてる時に急にEnterが押されてびっくりすると思うよ

Sub n時間後にEnterを押す()
  n = 1 'n時間を指定
  n時間後 = Now + TimeValue(n & ":00:00") 'n時間後が何時何分か計算する
  Do
    DoEvents
  Loop Until Now >= n時間後 'n時間誤まで待つ
  SendKeys "~" 'Enterを押す
End Sub
2021/09/12(日) 23:27:46.85ID:Nc1wnmSN0
>>990
(1)じゃなかった
(0)だった
2021/09/13(月) 01:05:28.69ID:gLuGYsXi0
>>991
せめてOnTime使えよ
2021/09/13(月) 01:09:51.01ID:DeEefxbAd
OnTimeはあとからタイマーの設定を確認したり停始する方法がないから使い勝手が悪すぎるのがなあ
2021/09/13(月) 01:34:41.43ID:/cjB8lcQM
配列に保存しとくか
シートに書き出しておく
それを元に確認したりキャンセルする
2021/09/13(月) 02:28:08.29ID:SNtxNYpLd
>>990
URLはここまででいいんだよ
https://whois.nic.ad.jp/cgi-bin/whois_gw?key=182.22.16.251
997デフォルトの名無しさん (ワッチョイ a6ba-WYzC)
垢版 |
2021/09/13(月) 07:15:43.89ID:oNrWMPyP0
>>992, 996
ありがとうございます!
2021/09/13(月) 07:30:13.42ID:GNx0xRRz0
つぎ
https://mevius.5ch.net/test/read.cgi/tech/1631485799/l50
2021/09/13(月) 07:41:47.37ID:KCvhkZmap
>>998
うむ、ご苦労
1000デフォルトの名無しさん (エムゾネ FF0a-dgdc)
垢版 |
2021/09/13(月) 09:30:38.14ID:Kz73eSbEF
1000ならコロナ収束
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 57日 0時間 48分 23秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。