Excel VBA 質問スレ Part48 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 6f8e-Fc1g)
垢版 |
2017/05/16(火) 08:24:45.78ID:iIGA/64l0
!extend:checked:vvvvv:1000:512

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

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

※前スレ
Excel VBA 質問スレ Part47 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1489557874/

※関連スレ
VBAなんでも質問スレ Part2
http://echo.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://echo.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 125
http://echo.2ch.net/test/read.cgi/bsoft/1481369538/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2017/05/16(火) 10:48:12.64ID:Gxqu5M/Va
前スレでScreenUpdating=Falseしない派いる?ってのがあったけど、コード書いてる時は基本しない。
あれで速くなったっていうのは基本コードが悪いだろ。
2017/05/16(火) 11:05:20.21ID:J7MMoyEGd
>>2
ScreebUpdating =False : 警告Off
ScreebUpdating =True : 警告On
2017/05/16(火) 11:06:03.77ID:J7MMoyEGd
連続typo失礼
2017/05/16(火) 11:08:01.35ID:l+zZTb7Y0
ScreenUpdatingの有無で速度が左右されるのは、セルに値を入れる等して描画に影響する操作をする場合だけだから、
結果を吐き出す際に一度だけしかセルにアクセスしないとかなら要らないね。
6デフォルトの名無しさん (オッペケ Sr27-fj9k)
垢版 |
2017/05/16(火) 12:41:08.19ID:6Q26Nvh7r
>>5
表示の更新してんなら要るわ

あとエクセルでセルに値を書き込むことを「吐き出す」と言うのは
素人が玄人の真似して訳もわからずそれっぽい言葉使ってみました感が強すぎる
分かる人が見ればコイツ馬鹿だなってバレバレだからやめた方がいいぞ
2017/05/16(火) 12:57:55.01ID:fevd2QwgM
自称玄人 w
2017/05/16(火) 13:01:13.42ID:J7MMoyEGd
つまり量によるわけだな。
2017/05/16(火) 13:03:31.49ID:J7MMoyEGd
つまり量によるわけだな。
ScreenUpdating = False しないと辛くなってきたら、それは
ワークシートで管理するデータや式が多くなりすぎたという警告とみなすスタイルが成り立つ。
2017/05/16(火) 14:23:33.68ID:Gxqu5M/Va
>>6
えっ?
素人玄人関係なく使うでしょ。
そんなの意識したこと無いぞ。

>>9
量なのかなあ。
そりゃいい加減にコード書くことも有るけど、そういう場合で遅く感じたらちゃんとしたコードに変更するだけだろ。
どうしても描画が何回か走ってチラつきを防止するために最後に追加するぐらいだな。
2017/05/16(火) 14:27:59.56ID:J7MMoyEGd
>>10
ちゃんとしたコードとは?

コードの問題ではなくてデータの問題だ、というのが俺の主張
2017/05/16(火) 14:53:18.62ID:Ilchk1CoH
不毛
2017/05/16(火) 14:57:07.86ID:l+zZTb7Y0
>>9
ワークシートから値を取り込んだり、値をワークシートに書き出したりっていう処理は、
Rangeを使えば一括して行うことが出来るので、データ量はそこまで問題にならない。

どちらかというと罫線、色、数式みたいな一括処理しづらいものが問題で、
ScreenUpdating次第で処理に大きく差が出る。
こういったものは保守も面倒なので手作業で代替出来ないかとか考えるといいかもね。
2017/05/16(火) 15:11:19.05ID:tw+4NZDm0
オートフィルタかけた後のデータの、特定の1列だけを配列に格納したいのですが、何かいい方法はないでしょうか
2017/05/16(火) 16:37:32.48ID:l+zZTb7Y0
>>14
SpecialCells(xlCellTypeVisible)で可視状態にあるセルだけを取り出せる。
2017/05/16(火) 19:14:29.63ID:iIGA/64l0
クラスモジュールって使いますか?
大抵のことはfornext、foreachで済んでしまうのですが、vbaでクラスを使ったほうが便利なのでしょうか
2017/05/16(火) 19:31:35.09ID:qhacRso4p
>>16
必要かどうかってことなら必要ない
でも大がかりなの作るなら使って整理したほうがやりやすいんじゃないのかな

for文と比較する感覚がいまいち伝わってないから的はずれならごめんなさい
関数とか配列とかと比較するならわからなくもないんだけれど
2017/05/16(火) 19:45:30.76ID:iIGA/64l0
>>17
私が使うのは事務処理で、表を作ったり、リネームする時にマクロを使う程度なのです
クラスはあんまり必要無さそうですね、ありがとうございました
19デフォルトの名無しさん (ワッチョイ 53c7-00IQ)
垢版 |
2017/05/16(火) 19:48:36.06ID:YL1OfOAE0
>>10
悪いけど素人しか使わんわそんな恥ずかしい言い方w
2017/05/16(火) 19:53:23.03ID:Y/+V2TLHM
言い方はどーだっていいんだよ
伝われば
2017/05/16(火) 20:28:49.31ID:rEbfD8DUa
>>13
うん、罫線とかはしようが無いね。
でも罫線もマクロ記録のままの酷いコード書く人もいる。

データについては1つ1つのセルに値を入れるなんてことはすべきじゃない。
普通は1つの表で一括入力でしょ。
どうしても速度を出したい時は汚くなるけどシート内データ全部を一括入力にする。
あとは、使える場面が限定されるけどマルチプロセスにするとか。

>>18
クラスを使う場面ってのは慣れてれば感覚的にぴったりくる。
オブジェクト指向的にぴったりくる場合。
でも、他のメンバーが慣れて無いと却って良くない場合もあるね。
2017/05/16(火) 21:04:28.77ID:ORpNRMoi0
Dim スコーン As New Class

↑このスコーン自体を引数に使うことは出来ますか?
スコーン.Name =
2017/05/16(火) 21:05:07.95ID:ORpNRMoi0
スコーン.Name = "スコーン" とか書きたんくないですんけど。
2017/05/16(火) 21:12:00.81ID:qp8pXuJpx
>>22
出来るよ。
そうしたい目的はなに?
2017/05/16(火) 21:38:51.33ID:ORpNRMoi0
>>24
>>23だと、スコーンの名前はスコーンとか言ってるようなものじゃないですか。
何か変なので、どうにかしたほうがいいなと。
2017/05/16(火) 21:44:47.11ID:FLRqiZ6lx
>>25
引数にしたいことと
nameに代入することの関係性が分からない。
まぁ宣言をお菓子にしとけばいいんでない。
2017/05/16(火) 21:48:13.03ID:iIGA/64l0
PHPならget_class()なんてそのまんまなものがあるんだけどね
vbaには無いっぽいな
28デフォルトの名無しさん (ワッチョイ 53c7-00IQ)
垢版 |
2017/05/16(火) 21:54:30.99ID:YL1OfOAE0
>>25
あーあ、やっちゃったね
質問するにもマナーってものがあるんだよ
スレを荒ららない為にもこの際覚えておけ

「目的を聞くやつにレスを返してはいけない」
2017/05/16(火) 21:59:56.08ID:wnIq1TKW0
そんな法則は聞かないな
2017/05/16(火) 22:19:15.46ID:FLRqiZ6lx
>>28
いつかそのマナー広まるといいね!
影でこっそり応援してぬわ。
2017/05/16(火) 22:30:24.74ID:H5+sVhHM0
なんで目的を聞くやつにレスを返してはいけないの?
質問の意図を汲もうとしているかもよ?
2017/05/16(火) 22:33:38.25ID:FLRqiZ6lx
>>31
その聞き方だと件の>>28は返事出来ないよ。
理由は察してあげて
2017/05/16(火) 22:35:06.66ID:iIGA/64l0
>>26
クラス名で分岐させたいパターンがある
ゲームプログラムだとclass名で敵か味方か判別する、というのは見たことがあるな
せめて継承でもできればその辺共通化できるんだけど、そこはvba。めんどくさい

しかしエクセルだとどういう状況か思い浮かばない

>>30
してなくて草
34デフォルトの名無しさん (ワッチョイ 53c7-00IQ)
垢版 |
2017/05/16(火) 22:44:02.80ID:YL1OfOAE0
>>31
質問の意図が分からん奴は質問に答えられない
目的を聞いても質問者の意図を引きだす事はできない
簡単な事だ
2017/05/16(火) 22:49:11.64ID:FLRqiZ6lx
>>34
なるほど。
素晴らしいね。
がんばれー
2017/05/17(水) 00:01:38.90ID:qRwApybV0
>>33
制御の向きが逆だよなあ
2017/05/17(水) 00:23:20.25ID:sfPoWe8nx
TypeName関数で自作クラス名って取り出せないんだっけ?
2017/05/17(水) 00:32:22.34ID:9uxtifvV0
>>37
それはできるけど、Meがない
Meがあればなんとでもできる

標準モジュール
Sub foo()
Set c = New Class1
'これはできる
Debug.Print TypeName(c)
End Sub

'クラスモジュール
Private Sub Class_Initialize()
'これができない
Debug.Print Me.TypeName
End Sub
2017/05/17(水) 00:39:06.93ID:dws00LGS0
クラス内部で つかうんなら
これじゃいかんのか?
Debug.Print TypeName(Me)
2017/05/17(水) 00:45:43.01ID:9uxtifvV0
>>39
すまん、いけた

解決!

標準モジュール
Sub foo()
Set bar = New Class1
Debug.Print bar.get_name()
End Sub

'クラスモジュール
Public name
Private Sub Class_Initialize()
name = TypeName(Me)
End Sub
Function get_name()
Debug.Print Me.name
End Function
2017/05/17(水) 00:51:22.92ID:sfPoWe8nx
解決やな
2017/05/17(水) 17:27:48.02ID:mwqvXh9q0
>>39
>>40
ありがとうございます。
それで名前があるものに名前を付けなくて済みます。
2017/05/17(水) 17:53:56.84ID:GJ9WSlKVH
>>40
そのコード、
Sub foo()
  Set bar = New Class1
  Debug.Print TypeName(bar)
End Sub
と同じじゃないの?

>>33
> せめて継承でもできればその辺共通化できるんだけど、そこはvba。めんどくさい
VBEのオブジェクトコンボボックスとプロシージャコンボボックスを選択すれば、
コードを自動生成してくれるから、全然めんどくさくないよ。
44デフォルトの名無しさん (ワッチョイ 53c7-00IQ)
垢版 |
2017/05/17(水) 20:29:29.04ID:G7cUCqPy0
俺は今重要な判断を下した
お前らは事務のねーちゃんよりスキルが低い
少なくともうちの事務のねーちゃんより低い事は確実だ
2017/05/17(水) 21:05:07.82ID:9uxtifvV0
>>44
お前、レスもらうのめっちゃうまいなw
思わず反論しそうになった
2chでレスをもらう能力、俺は敬意を表するよ

もしよければ、年齢と性別、職業を教えてほしい。どんな人か本気で気になる
2017/05/18(木) 06:43:55.44ID:PgOUGGac0
24歳

マイクロソフトジャパン勤務
2017/05/18(木) 08:36:51.83ID:7Fv0UmYNx
>>46
悪くないよ。
なんつーかコウウン
48デフォルトの名無しさん (ワッチョイ eef3-8cHL)
垢版 |
2017/05/18(木) 14:52:51.70ID:5nCvEgDF0
Private Sub Worksheet_Change(ByVal Target As Range)

Select Case Target.Address

Case "$A$1"

If Not IsNumeric(Target.Value) Or Target.Value = "" Then

Exit Sub

Range("B1:B9").Copy Range("B2")

Range("B1").Value = Range("A1").Value

Target.Select

End Select

End Sub

このコードの意味教えてくださいー
2017/05/18(木) 15:34:33.70ID:ZtOQ2Qac0
まずは実行してみたらどうだ
2017/05/18(木) 17:11:10.34ID:d+oDyp660
Private Sub Worksheet_Change(ByVal Target As Range)
ここに、Subの処理を定義する
End Sub

Select Case Target.Address
ここに、Caseの処理を定義する
End Select

Select Case Target.Address
// Target.Address が、"$A$1"なら
Case "$A$1"

// Target.Value が数値ではない、または、空文字列なら、Subを抜ける
If Not IsNumeric(Target.Value) Or Target.Value = "" Then

Exit Sub

// copy
Range("B1:B9").Copy Range("B2")

// 代入
Range("B1").Value = Range("A1").Value

// 選択?
Target.Select

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

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