Excel VBA 質問スレ Part49©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/06/26(月) 02:15:14.60ID:T3ylemnb0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい

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

※前スレ
Excel VBA 質問スレ Part48
http://mevius.2ch.net/test/read.cgi/tech/1494890685/

※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
105デフォルトの名無しさん (ワッチョイ bd8b-UM0m)
垢版 |
2017/07/03(月) 22:43:07.60ID:c364q6zP0
あ〜万個増殖ね〜ありがちだわ〜
2017/07/03(月) 22:46:45.91ID:S8hpBEzs0
>>104
あー、DoEventsuはマクロ実行終わるまで時間かかるんでEscでマクロ止めてた時の名残です。
今は必要ありません。消し忘れてました。
2017/07/03(月) 23:22:39.55ID:u6VhpuAl0
>>91
すみません…
まだ勉強し始めたばかりで何故入れ替えただけで逆に表示されるのかが分かりません
理由を教えて下さりますと幸いです
2017/07/03(月) 23:23:15.28ID:NJa6/A120
ん〜
まずはループが最終的に何回転してるのか見てみた方が良さそう

自分ならまず新しいファイルにコードをコピペしてゴミ掃除するが
2017/07/03(月) 23:58:29.09ID:MkRtof65M
>>107
コレを動かしてみたらわかるよ

Sub nisinsu()
Dim Z As Single, S As Long, N As String, A As String
Dim AA As Single
Z = 100
S = 1
Do Until Z <= 0
N = Z Mod 2
Cells(S, 1) = Z
Cells(S, 2) = N
Z = Z \ 2
A = N + A
Cells(S, 4) = A
AA = AA + N
Cells(S, 5) = AA
S = S + 1
Loop
Cells(1, 3) = A
End Sub
2017/07/04(火) 00:10:14.68ID:pX4cRUUJ0
>>102
<0と>0をUnionでまとめてからコピペしたら速くなりそう。
ただUnionのセル数が増えすぎるとUnion自体が遅くなるみたいなので、1〜数十行くらいで区切ったほうがいいかも?

まあ>>97のほうが速い気はするけど。
2017/07/04(火) 05:36:03.11ID:JPw87neNM
これって今何行あるの?
何万行もあって列数50あれば大分重くなると思うけど
2017/07/04(火) 06:53:55.04ID:SZEZ7cdP0
6000回もselectとcopyしてりゃ遅くなるの当たり前
113デフォルトの名無しさん (オッペケ Sr71-nSMp)
垢版 |
2017/07/04(火) 08:12:48.47ID:n1qpisHfr
田のクラッカー
2017/07/04(火) 10:15:18.62ID:hKxheJiwa
セレクトなくしたら2/3ぐらいにはなりそうだな
まあどう考えてもコピペはロスがでかい
指定する書式はマクロの記録か大抵ググりゃ出てくるから調べんさい
2017/07/04(火) 20:20:52.61ID:aFK9C0z90
>>89>>102です。

>>103 図形のオブジェクトはありませんでした。でも変なオブジェクトが多量に残っていたという経験は過去にありました。確認してみます。
>>110 Unionでまとめて処理ですか。試してみます。>>97と比較してみます。
>>111 実際の行は数千行ありますが、実際には最終行から200行しか処理してません。後出しになりますが>>102ではその部分を省きました。ごちゃごちゃするかなと思い・・・
2017/07/04(火) 20:21:31.96ID:aFK9C0z90
>>89>>102です。

>>112 直接書式を設定したほうがよさそうですね
>>114 >>97を試してみます

みなさまありがとうございました。土日に試してみます。諸事情で今は試せないので。
2017/07/04(火) 23:04:48.45ID:n6RB6fUl0
>>116
頑張ってベターな方法探してね!
2017/07/05(水) 00:29:10.07ID:VBidwpfq0
ベタな方法を探す?
119デフォルトの名無しさん (アウアウウー Sa25-k1q/)
垢版 |
2017/07/05(水) 10:23:55.19ID:jMcI5nQfa
ダブルクリックとシングルクリックを区別する処理を考えましたがあまり
美しくないです。もっとスマートな方法はありますか?
VDim isDoubleClick As Boolean
Dim cancelClick As Boolean
Private Sub CommandButton1_Click()
____Dim i As Long
____For i = 0 To 2048
________DoEvents
________If isDoubleClick = True Then
____________Exit Sub
________End If
____Next i
____If (cancelClick = False) Then
________' シングルクリック時の処理はここ
________Worksheets(1).Range("a1").Value = "シングルクリック"
____End If
____cancelClick = False
End Sub
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
____isDoubleClick = True
____' ダブルクリック時の処理はここ
____Worksheets(1).Range("a1").Value = "ダブルクリック"
____isDoubleClick = False
____cancelClick = True
End Sub
Private Sub UserForm_Initialize()
____isDoubleClick = False
____cancelClick = False
End Sub
2017/07/05(水) 11:03:35.66ID:bK7Vkfgva
>>119
vba クラス コントロール イベント
とかでググれば
2017/07/05(水) 13:18:10.58ID:r0cXYB/2H
>>119
内容と全然関係ないけど、全角スペースでインデントすれば削除されないよ
2017/07/05(水) 16:49:43.67ID:F7dOY4NYa
>>120
ありがとうございます。質問そのものについてはタイマー張ることで実現
できることがわかりました。
また、イベントハンドラをまとめる方法もついでに知ったので助かりました!
>>121
次からそうします。ありがとうございます。
2017/07/05(水) 22:43:43.51ID:kJzSrAyN0
セルの値を配列に入れる時、
セルが1つだけだと、一次元配列になっちゃうってひどくね。
2017/07/05(水) 22:47:37.84ID:VdD8AIen0
次元数が変化するとめんどくさい時は、常に同じ次元数になるようにfunctionを噛ませる
125デフォルトの名無しさん (ワッチョイ bd8b-UM0m)
垢版 |
2017/07/05(水) 22:49:15.43ID:odMt6Ynp0
セルが2つだと二次元配列になっちゃうよ
126デフォルトの名無しさん (アウアウウー Sa25-k1q/)
垢版 |
2017/07/05(水) 23:46:14.85ID:F7dOY4NYa
DAOとADOの使い分けを教えて!
2017/07/06(木) 00:36:18.68ID:in8T4yu80
使い分けというかADOはDAOに比べて何かと便利だからADOだけ使えばいいんじゃないかな。
AccessだとデフォがDAOなんで使う事も多いけどエクセルで使うときのメリットは特に思い浮かばない。
2017/07/06(木) 00:50:14.75ID:J3gAfYSVa
>>127
回答ありがとう。今はMySQLに接続しようとしているのでADOを選びます。
まだVBA始めて4日目なのでわからないことばかりですが
2017/07/06(木) 02:37:48.69ID:2ggUG7GkM
>>123
Resizeで1行追加して、配列を1行減らせばいいんじゃないかと思った。
2017/07/07(金) 06:50:33.44ID:k9X/9vlT0
すいません
パソコンのエクセル2016で作ったVBAをスマホで動かすことはできますか?
スマホでVBAの作成編集は無理のようなので
2017/07/07(金) 07:44:52.11ID:6QLBDLc9d
>>130
むしろ教えてもらいたい
2017/07/07(金) 08:54:05.14ID:KQxBqvcO0
関数でがんばれ
2017/07/07(金) 21:24:02.96ID:IxSbuhab0
>>130
基本的に無理じゃね。
スマホ側OfficeがVBAサポ―トしてないと。
その上でWin32API使用してたら、更に無理だし。
2017/07/07(金) 21:25:43.56ID:t0FXhP6Gd
ノートでも画面狭く感じるのにスマホでなんてストイック過ぎる
2017/07/07(金) 22:19:46.83ID:02peKi+J0
アリエッティだから…
136デフォルトの名無しさん (ワッチョイ 778b-QU0D)
垢版 |
2017/07/07(金) 23:07:11.35ID:tdv0VtnU0
ネゴシックスだから…
137デフォルトの名無しさん (ワッチョイ 97ea-okny)
垢版 |
2017/07/07(金) 23:13:49.66ID:q3zfwuJv0
vbaってエクセル用の言語?
他にも使えるの?
2017/07/07(金) 23:24:32.16ID:IHJ5BTGs0
アクセスやワードでも使えるよ
アクセスvbaはたまによく使う。SQL覚えたほうがいいけど
ワードはワード自体使わん
139デフォルトの名無しさん (ワッチョイ d701-LW04)
垢版 |
2017/07/07(金) 23:41:29.01ID:cLxiai6C0
初歩的な質問で、すみません。

vbaの公式本で独学で勉強中なのですが、
なぜこうなるのかわかりません。
よければ教えてほしいです。

不明点:

@なぜnumがセルa1〜a3だと認識されるのか。
b1〜b3も記述しているので、b1〜b3と認識されないのはなぜか。

Aこういうもんだと言われればそれまでなのですが、
ほかにもnum以外に自動認識されるような用語はあるのでしょうか。



Sub sampel()

 Range("b1") = percent(Range("a1"))
 Range("b2") = percent(Range("a2"))
 Range("b3") = percent(Range("a3"))

End Sub

Function percent(num) As String

 percent = num / 100 & "%"

End Function
2017/07/07(金) 23:52:29.75ID:02peKi+J0
関数 percent(num) で呼び出しもとで
引数 numに Range("a1") をセット(厳密には違うか)してるから


って釣りだよな
2017/07/07(金) 23:55:59.29ID:IHJ5BTGs0
>>139
残念ながらかなり根本的な事がわかっていない

function〜はユーザー定義関数っつって、処理をひとまとめにしたもの

numってのは変数名。これは自分で決めるもので、
「num」でも「namu」でも「ナンバー」でもなんでもいい。
「sub」「if」みたいな単語は予約語と言ってそれらは使えないんだけど、まぁ何となく分かるだろう

毎回'こう書くのがめんどくさいから
Range("b1") = Range("a1") / 100 & "%"
'functionを定義して、使い回しできるようにしているだけの話
Range("b1") = percent(Range("a1"))

function作るのめんどくさくね?
と思ったかもしれないけど、それは何もわかっていないだけ
素直にこういうもんだと覚えてくれ
142デフォルトの名無しさん (ワッチョイ d701-LW04)
垢版 |
2017/07/07(金) 23:57:08.34ID:cLxiai6C0
すみません。意味が分かりました。
2017/07/07(金) 23:58:31.41ID:J/by2x1N0
>num以外に自動認識されるような用語


自動認識されるような用語って何?初めて聞いた
2017/07/08(土) 00:00:19.52ID:lNWyFXj50
>>142
良かった、頑張ってねぇ〜
2017/07/08(土) 00:06:47.50ID:13H3LMpq0
>>143
AレジスタとかBレジスタとかと想像してみる

>>142 ほ、ほんとに初心者だったのかスマン
2017/07/08(土) 00:07:48.82ID:ieaMtMqy0
>>143
多分だが、引数を理解できてなくて
numに勝手にマッピングされてる、みたいに思ったんじゃないか
なんか勉強の順番おかしいんじゃない?
もっと前のフェーズでの学習が抜け落ちたまま次進んでる気がする
2017/07/08(土) 00:09:10.26ID:pa5RQPEd0
>>145
いやいや、いきなりアセンブラは無いだろとw
2017/07/08(土) 00:11:00.51ID:lNWyFXj50
>>146
俺もそう感じた
ただ学習の本やサイトも「おまじない」とかアホなことぬかすからわけがわからなくなるんだと思う
2017/07/08(土) 01:17:01.28ID:5hrqvRHFd
俺何年もVBAつかってるけどオプションイクスプリシットとか読めないわ書けるけど
ただのおまじないだしないいよな別に
150デフォルトの名無しさん (ワッチョイ 97ea-okny)
垢版 |
2017/07/08(土) 04:13:51.39ID:4CWa99QQ0
Private Sub Worksheet_Calculate()


If Worksheets("sheet1").Cells(3, 20) > 4000 Then

Worksheets("sheet1").Range("V4:AP4").Insert

End If


end sub

インサートがめっちゃ繰り返される。どうして?
2017/07/08(土) 08:57:15.58ID:YOB7IyKs0
>>150
ifが永遠にtrueになるからではないか
セル挿入→再計算→ifがtrue→セル挿入→再計算→ifが(略
Worksheets("sheet1").Cells(3, 20) がいつ4000以上になるのか
本当になるのかチェック
2017/07/08(土) 09:26:58.00ID:lNWyFXj50
>>150
Application.EnableEvents = False
で、eventを止める
そうしないと
>セル挿入→再計算→Worksheet_Calculate→ifがtrue→セル挿入→再計算→Worksheet_Calculate→ifが(略
が起こる

Private Sub Worksheet_Calculate()
Application.EnableEvents = False
If Worksheets("sheet1").Cells(3, 20) > 4000 Then
Worksheets("sheet1").Range("V4:AP4").Insert
endif
Application.EnableEvents = True
End Sub
153デフォルトの名無しさん (ワッチョイ 97ea-okny)
垢版 |
2017/07/08(土) 13:34:02.80ID:4CWa99QQ0
>>151,>>152
的確な指示ありがとう!!(笑)
すごいなここの人は
154デフォルトの名無しさん (ワッチョイ b7e3-jTKI)
垢版 |
2017/07/08(土) 16:53:25.86ID:Z/1cPHhj0
>>149
別にいいよ、モジュールの一番上にそれを書くのを忘れなければ
2017/07/08(土) 17:53:16.70ID:lfjWBFMWd
モジュールの一番上に書くのは153でしょ

'2ちゃんねるの神様に教えてもらったコードです
'神様ありがとうございます
Option Explicit
Sub foo()
156デフォルトの名無しさん (ワッチョイ ffb9-wcci)
垢版 |
2017/07/09(日) 00:06:53.03ID:8a4WwF270
こんばんは。
困ってます。

先日作成したマクロが動かなくなりました。
作成した日は動きました。
(特定のフォルダをコピーしてリネームするだけの動きです。)
プログラムを手動で実行したときは問題なく動くので、
プログラムの問題ではなさそうなのですが。

エクセルのセキュリティは、「警告を表示してすべてのマクロを無効にする」
にしています。
エクセルの再起動・PC再起動は試しましたが、だめでした。

C:\...Local\Temp\Excel8.0のMSForms.exdも消してみたりしましたがダメでした。

原因は何でしょうか・・・?
157デフォルトの名無しさん (ワッチョイ ffb9-wcci)
垢版 |
2017/07/09(日) 00:08:43.90ID:8a4WwF270
スペック全然書いてなかった。

Windows8.1
Excel2013 です。
158デフォルトの名無しさん (ワッチョイ ffb9-wcci)
垢版 |
2017/07/09(日) 00:14:34.37ID:8a4WwF270
すみません。
書き込んですぐに自己解決しました。

コマンドボタンのオブジェクト名が違ってた・・・。
2017/07/09(日) 03:04:28.53ID:EKrowZUC0
>>158
良いんだけどさ、最低限デバッグ出来るようになってくれ。
2017/07/09(日) 10:34:39.10ID:ouwdb2hLM
まあ、解決したことを書いてくれたのはよかった
2017/07/09(日) 12:02:55.24ID:P74F/v7B0
デバッグ始めにtypoを疑って問題ないと確認して、
さんざん調べてやっぱりtypoの時の脱力感
2017/07/09(日) 12:34:26.09ID:XJb9KLmK0
optionexplititをつけよう(typo)
2017/07/09(日) 13:33:12.66ID:Uu/MlKNRM
>>161
他人のtypoはすぐにわかるのになぜかわからない自分のtypo
2017/07/09(日) 19:05:53.04ID:WoCQL3Mea
初心者的な内容ですいません。
よければ教えてください。

1はなぜactivesheetでなくshが回答となるのでしょうか。
shがworksheetsとして定義されていないのになぜ、worksheetsとして考えられるのかわかりません。

---------

次のイベントプロシージャはブックに新しいシートを挿入したときに実行される。
挿入されたシートのシート名を、ユーザーがダイアログボックスから入力した名前に変更させたい。
このとき、【 1 】に入る適切な命令を解答欄に入力しなさい。
ただし、シート名の重複などのエラー処理は省略しているものとする。

Private Sub Workbook_NewSheet(ByVal Sh As Object)

Dim strSheetName As String
strSheetName = InputBox("新しいシートの名前を入力してください")

If strSheetName <> "" Then

【 1 】.Name = strSheetName

End If

End Sub
2017/07/09(日) 19:17:48.71ID:IxMSo5tD0
Sh As Objectって何だよ。
Sh As Worksheetじゃないのか。
問題に突っ込んでもしょうがないけど。
2017/07/09(日) 19:25:01.06ID:WoCQL3Mea
スタンダード公式ページの模擬問題3に書いてありました。

問題がおかしいのでしょうか?
2017/07/09(日) 19:29:29.32ID:e2g8wwYr0
>>164
新しくできたシートが引数Shで渡されている。
(ByVal Sh As Object)の部分。
Workbook_NewSheetのイベントプロシージャの仕様。
たいてい、どのイベントプロシージャも自分自身の参照を引数で渡されている。
ので、この場合、新しくできたシート自身を操作したければ
引数で渡ってきているShを操作すればよい。
2017/07/09(日) 19:33:19.71ID:aVb+3v1/0
挿入された新規シートが必ずActiveSheetだとは限らないんじゃない?
イベントプロシージャに新規シートが引数として渡されるのだから、それを使うのが確実

ちなみに問題が As Object なのは間違ってない
https://msdn.microsoft.com/ja-jp/library/office/ff821246.aspx?f=255&;MSPPError=-2147217396
2017/07/09(日) 19:35:24.63ID:WoCQL3Mea
こういう仕様があったんですね‼

ありがとうございます。
スタンダード合格出来るよう頑張ります。
2017/07/09(日) 19:42:48.30ID:XJb9KLmK0
worksheetでもいいだろ、と思ったらエラーになった
確かにobjectであって、worksheetではない
http://stamp-uploda.com/src/file7295.jpg
ってかこれ、一体なんなんだ?参照だろうけど、中身が全くないobjectが渡されてる。意味がわからない
2017/07/09(日) 19:44:44.18ID:XJb9KLmK0
ウォッチ式では
sh.name
はウォッチ式が不正です

イミディエイトウィンドウでは
?sh.name
Sheet4
とシート名が返ってくる

なんだこりゃ??
2017/07/09(日) 19:56:26.06ID:B1MJdm2Aa
>>171
ウォッチ式にsh.nameが指定されてる?
shじゃ無くて?
2017/07/09(日) 20:10:27.05ID:e2g8wwYr0
ためしに別の変数にShを突っ込んでみたら
中身が見られるようになった。

どっかで、オブジェクト変数は利用されるまで中身が入らないよ
みたいな話を聞いたような・・・。
2017/07/09(日) 20:17:33.00ID:XJb9KLmK0
>>172
試してみたら、ウォッチ式でもイミディエイトウィンドウでもsh.nameはうまく取れた。
ウォッチ式のshは取れない。
なんかバグの温床になりそうで、このshあんまり使いたくないなぁ…

環境はwindows7 エクセル2010

vbaコード
Private Sub Workbook_NewSheet(ByVal Sh As Object)
MsgBox 1 'ブレークポイントを設定している
End Sub

ウォッチ式に
sh
sh.name
を追加
shは図のとおり、変な状態になる。プロパティなどが表示されない
sh.nameはシート名が表示される

イミディエイトウィンドウは正常
?sh.name
Sheet5

http://stamp-uploda.com/src/file7296.jpg

>>173
プロパティ(sh.name)を呼び出してみた後の状態
(メッセージボックスにはsheeet6と正常に表示された)
やっぱりダメだった。
http://stamp-uploda.com/src/file7297.jpg

なんらかの理由でウォッチ式が正常に機能してないだけならいいけど、正常な状態でこれだとどういう状況なんだろう
2017/07/09(日) 20:42:05.40ID:e2g8wwYr0
>>174
Dim sheet as Worksheet
Set sheet = Sh

これをmsgboxの前に追加すると全部の変数がウォッチで見られると思う。

ググってみたらNewで作ったオブジェクトは初めて利用するまで空ですよ
らしいので、新シートのオブジェクトは内部的にNewで作成している?
Sh.nameが引けるのは何ででしょう?
2017/07/09(日) 20:43:00.97ID:vBmV/XSmd
それよりも改行しないコードかく人は何を考えてコード書いてるのか気になる
177デフォルトの名無しさん (ワッチョイ 9791-9DAm)
垢版 |
2017/07/09(日) 20:43:34.76ID:BT4+59vh0
>>174
objectで受け取ってるからshのままでは何のクラスなのかわからないからどんなプロパティがあるかわからない

Nameプロパティを指定したら
Nameプロパティを持っているクラスとして解釈して
Nameプロパティの位置を文字列として表示しただけ

worksheetクラスのデフォルトプロパティがNameだからかな

countプロパティとかとして解釈させたら想定外の値になると予想
2017/07/09(日) 20:46:50.81ID:e2g8wwYr0
>>177
VBAマスター現る。
なっとく。
179デフォルトの名無しさん (ワッチョイ 9791-9DAm)
垢版 |
2017/07/09(日) 20:49:10.77ID:BT4+59vh0
>>178
VBAだけじゃなくて他のプログラミング言語C言語とかと共通の考え方

メモリ確保とかキャストとか
180デフォルトの名無しさん (ワッチョイ 9791-9DAm)
垢版 |
2017/07/09(日) 20:54:20.52ID:BT4+59vh0
>>164
1が実行されるまでの間にactivesheetが変わるかもしれないからactivesheetでは不正解だと思う

出来るだけactivesheetを使わない方が想定外の動作にならないと思う
181デフォルトの名無しさん (ワッチョイ 778b-utq/)
垢版 |
2017/07/09(日) 20:55:59.71ID:oI2zN/et0
てかお前らそんなに一か八かでactivesheet使ってんのかよw
2017/07/09(日) 21:19:51.98ID:XJb9KLmK0
これが通るけど、ウォッチ式には現れない
多分ウォッチ式の不具合だと思う
そう考えないと気持ち悪くて仕方ないし疲れてきた・・・

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Calculate
MsgBox Sh.Index
End Sub

http://stamp-uploda.com/src/file7299.jpg

>>175
sheetでもShでも見れるようになりました
Shの参照をコピーしたのでインスタンスが生成されたのかな

>>177
indexプロパティでも通りましたし
Sh.Calculateメソッドでも通りました

>>181
使ってないよ。sheetの指定はsetした変数を使ってる
昔はactive〜やselect〜を使ってたけどね
183デフォルトの名無しさん (ワッチョイ 9791-9DAm)
垢版 |
2017/07/09(日) 21:38:18.71ID:BT4+59vh0
>>182
worksheetクラスではないクラスのプロパティを指定したらどうなると予想する?

例えばRangeクラスのプロパティとか

もしかしたらサイズとかを見ていてサイズが異なる場合はキャスト出来ないかもしれないど

メモリ領域には値が格納されているけどそれをどう解釈するかはクラスが決まらないと特定できない
2017/07/09(日) 21:45:51.77ID:XJb9KLmK0
>>183
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Debug.Print Sh.Range("a1").Address
End Sub

$A$1
が返ってきたわ

http://stamp-uploda.com/src/file7301.jpg
2017/07/09(日) 21:47:17.93ID:XJb9KLmK0
写ってないけどウォッチ式のshのプロパティは不明なままね
ウォッチ式がおかしい以外考えにくい
2017/07/09(日) 22:03:56.91ID:e2g8wwYr0
Private Sub Workbook_NewSheet(ByVal sh As Object)
 Dim obj As Object
 Set obj = sh
 MsgBox obj.Name
End Sub

これだと中身が見られないけど通る。
やっぱり>>183の型キャスト説じゃないかなぁ。
ローカルウィンドウでも見られないし。

obj.Value = "aaa" で実行時エラーになる。
「ん〜何か知らないけどValueに入れるよ?あっねえわw」 ってことでは?

.Nameや.Range().Addressはあったんで通る。
2017/07/09(日) 22:23:32.11ID:XJb9KLmK0
>>186
それはrange指定してないっす・・・

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Cells(1, 1).Value = "aaa"
End Sub

で通ったよ
188デフォルトの名無しさん (ワッチョイ 9791-Razr)
垢版 |
2017/07/09(日) 22:31:30.92ID:BT4+59vh0
>>184
Debug.Print Sh.Range("a1").Address
ではなくて
Debug.print sh.address
だったらどうなるかって意図だったけど
ためしたら実行時エラーになる
これはtypename(Sh)を表示したらわかるけど
Shという変数自体にクラス(型)に関する情報を持っているから
無理矢理Rangeクラスのプロパティを表示させようとするとエラーになる

dim rng as Range
set rng = Sh
とかやっても実行時エラーになる
文法的にはエラーじゃないからコンパイルは通る

VBAが型チェックしてバグにならないようにしていると思う
他の言語だとこれができるものもある
189デフォルトの名無しさん (ワッチョイ 9791-Razr)
垢版 |
2017/07/09(日) 22:35:23.27ID:BT4+59vh0
>>187

ShがWorksheetクラスだっていうのが判ってるからRangeを指定するってわかるけど
Objectクラスだったら何のプロパティを持っているかわからなくない?

Objectクラスはすべてのクラスのスーパークラスだから何でも参照できる
Sh as Objectと宣言されているShが実態はRangeクラスである場合もある
その場合は、Sh.Value = "a"でも実行時エラーにはならない
2017/07/09(日) 22:50:14.83ID:XJb9KLmK0
>>188-189
なるほど、意図が分かりました。コンパイルエラーになる意味もわかりました、ありがとうございます

以下の状態だと、shの型はobject/Sheet5としてウォッチ式に認識されます
この「Sheet5」というのは何でしょうか?
デフォルトプロパティでしょうか?

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim sheet As Worksheet
Set sheet = Sh
Debug.Print 1 'ここでブレークポイント
End Sub
2017/07/09(日) 22:58:28.17ID:XJb9KLmK0
しかし>>175がどうしてもわかりません

object型をobject型に渡してもプロパティは分からない、それは分かります
http://stamp-uploda.com/src/file7303.jpg

object型をworksheet型に渡すと、ウォッチ式で見れるようになる、それがわからない
http://stamp-uploda.com/src/file7302.jpg
全部のプロパティ・メソッド見たら全部一致してたからworksheetとしてコピーしますね〜ということ?
192デフォルトの名無しさん (ワッチョイ 9791-Razr)
垢版 |
2017/07/09(日) 23:03:28.23ID:BT4+59vh0
>>190
Set sheet = Sh
を実行した時点で、Sh = sheet = Worksheetクラスのオブジェクトと特定可能
なのでworksheetクラスのデフォルトプロパティを表示しているのではないか

ウォッチ式にsheet変数も追加すると、そのタイミングで
Shの他のプロパティも見えるようになった
2017/07/09(日) 23:06:31.26ID:e2g8wwYr0
>>191
型キャストで
Shがワークシートだと判明したので
Shとsheetは同じ物なので
両方のプロパティが同じで表示されるのではと思うが。
詳しくはマスターにまかせる。

と思ったらもう回答されていた。

すごい勉強になった。
194デフォルトの名無しさん (ワッチョイ 9791-Razr)
垢版 |
2017/07/09(日) 23:09:27.92ID:BT4+59vh0
>>191
ウォッチ式の表示更新タイミングはその内容が特定されたときに
即座に表示更新されるとは限らない
つまり表示更新されるよりもずっと前に表示すべき内容が特定されていた可能性もある
2017/07/10(月) 09:22:58.03ID:HOfsyLJOa
activesheet使うのはworksheets.copy使うときぐらいだな
真面目に作るときは書式とか直で指定するように頑張るけど
2017/07/10(月) 12:08:47.45ID:G+8qCprO0
レコードセットをそのままシートに張り付けると、元の型を継承して数字のみのカラムも文字列として貼られるんだけど、さすがにどうしようもない?
2017/07/10(月) 12:39:11.04ID:okOc14zTd
>>196
あとで一括して和0すりゃいいじゃん
198デフォルトの名無しさん (ササクッテロロ Spcb-9DAm)
垢版 |
2017/07/10(月) 12:47:22.77ID:8dcdQUy6p
>>197
和は加算の結果を表す言葉
0を加算とか足す0じゃないと意味が違ってくる

因みにレコードセットの型はcolumnの最初の7行分のデータから推測されるとかだったと思うから
目的の型になるようにソートすればいいかも
2017/07/10(月) 13:37:23.50ID:WkincIndM
関数の引数にbyval ws as Worksheetってやるとどうなるの?

worksheetに対しては、byrefしか使ったことない
2017/07/10(月) 14:25:22.38ID:/gGZBLtxM
オブジェクト型はbyval渡し出来ないんじゃなかったっけ?
2017/07/10(月) 14:36:15.11ID:okOc14zTd
>>198
なるほどそうだぬ
「ゼロを一括して加算(D)すりゃいい」と言い直させてもらう

もともと具体的に書かず曖昧な表現を目指していた
2017/07/10(月) 14:38:53.50ID:okOc14zTd
>>200
できるよ。
メソッド呼び出しもそのオブジェクトに対するものとなる。
違いが出るのは代入(=)演算の意味だけだと思う。
2017/07/10(月) 15:15:06.40ID:UwxUnls6M
>>199
たぶんプロシージャ内の set ws=hoge が引数に反映されるかされないかが変わってくる
2017/07/10(月) 16:10:50.58ID:1UBLPYX0M
>>203
ありがとうございます。
時間あるときに試してみます!
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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