Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7823 / 13645 ツリー ←次へ | 前へ→

【36495】基本なのでしょうが・・・・ エラーやだヽ(´・ω・`)ノ 06/4/2(日) 1:48 質問[未読]
【36504】Re:基本なのでしょうが・・・・ かみちゃん 06/4/2(日) 11:37 発言[未読]
【36506】Re:基本なのでしょうが・・・・ momo 06/4/2(日) 11:51 発言[未読]
【36514】Re:基本なのでしょうが・・・・ かみちゃん 06/4/2(日) 12:49 発言[未読]
【36541】Re:基本なのでしょうが・・・・ neptune 06/4/3(月) 8:47 発言[未読]
【36516】Re:基本なのでしょうが・・・・ Kein 06/4/2(日) 13:05 回答[未読]
【36523】Re:基本なのでしょうが・・・・ プルート 06/4/2(日) 13:44 発言[未読]
【36543】Re:基本なのでしょうが・・・・ Jaka 06/4/3(月) 10:11 発言[未読]
【36549】Re:基本なのでしょうが・・・・ プルート 06/4/3(月) 11:08 発言[未読]
【36554】みなさんご回答ありがとうございます。。 エラーやだヽ(´・ω・`)ノ 06/4/3(月) 11:58 お礼[未読]
【36555】Re:みなさんご回答ありがとうございます。。 Jaka 06/4/3(月) 12:18 回答[未読]
【36557】Re:みなさんご回答ありがとうございます。。 エラーやだヽ(´・ω・`)ノ 06/4/3(月) 13:12 質問[未読]
【36559】Re:みなさんご回答ありがとうございます。。 Jaka 06/4/3(月) 13:58 発言[未読]
【36615】セルを選択するのと選択しないのと速度差。 Jaka 06/4/5(水) 15:58 発言[未読]
【36638】間違い修正 Jaka 06/4/6(木) 10:17 発言[未読]
【36645】Re:セルを選択するのと選択しないのと速度... エラーやだヽ(´・ω・`)ノ 06/4/6(木) 16:38 質問[未読]
【36648】Re:セルを選択するのと選択しないのと速度... Blue 06/4/6(木) 17:26 発言[未読]
【36653】Re:セルを選択するのと選択しないのと速度... かみちゃん 06/4/6(木) 22:40 発言[未読]
【36663】Re:セルを選択するのと選択しないのと速度... Jaka 06/4/7(金) 11:42 発言[未読]

【36495】基本なのでしょうが・・・・
質問  エラーやだヽ(´・ω・`)ノ  - 06/4/2(日) 1:48 -

引用なし
パスワード
   皆様初めまして。
言語のげの字も知らないのに仕事でVBAでなにやら作れって言われて四苦八苦しています。

色々作ってみて未だによくわからないのですが、.selectでアクティブ?にしてからでないとできない処理にはどんなものがあるのでしょうか?
rangeでセル範囲を選択したり、コピー等を動かそうとするとよくひっかかってしまいます・・・。

また、長いコードになると変数が多くなりすぎて自分でも覚えきれないのですがみなさんはどういう風に変数名をつけているのでしょうか?

【36504】Re:基本なのでしょうが・・・・
発言  かみちゃん  - 06/4/2(日) 11:37 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>言語のげの字も知らないのに仕事でVBAでなにやら作れって言われて四苦八苦しています。

直接の回答ではありませんが、
まずは、「マクロの記録」で記録するところからはじめていけばいいのではないでしょうか?
そこから、意味がわからないコードのヘルプを参照して、使用例としてサンプルが
あれば、それを使ってみる。
その使用例でまたわからないものが出てきたら、さらにヘルプを参照していく。
あとは、ここのような掲示板やWeb上にいろいろなサンプルが出ていますので、
検索して、それをまねてみる
など、一歩一歩肉付けしていけばいいのではないでしょうか?

それとも、仕事で指示されたから、そんな勉強している余裕はないということでしょうか?

【36506】Re:基本なのでしょうが・・・・
発言  momo  - 06/4/2(日) 11:51 -

引用なし
パスワード
   はじめまして〜!

私もExcel関数すら知らないところからはじめて、
今では何とかADOとか使ってデータベースっぽいものまで会社にささげられるようになりました。
ひとえに、こちらのサイトのおかげなのですが。。。

とはいえ、やはり、かみちゃんさんのおっしゃる通り、
最初は、ひたすらマクロ記録⇒ヘルプ参照⇒ネット検索の繰り返しでしたね^^;
特にヘルプは、宝の山のように思ってました。

>色々作ってみて未だによくわからないのですが、.selectでアクティブ?にしてからでないとできない処理にはどんなものがあるのでしょうか?
>rangeでセル範囲を選択したり、コピー等を動かそうとするとよくひっかかってしまいます・・・。

ちなみに、selectでアクティブにしなくても良い処理は結構多いように思います。
このサイトでの受け売りですが、selectにしてからの処理だと、遅くなったりするので、
あまり多用しないほうが良いでと思いますよ。


>また、長いコードになると変数が多くなりすぎて自分でも覚えきれないのですがみなさんはどういう風に変数名をつけているのでしょうか?

私は、個人的には(誰にも教わったことがないのですが)、
functionは、日本語名で解りやすく。
汎用する関数は、a,b,i,j,kなど、一般的なやつで。
使いまわす関数は、cel_positon_x,string_lengthなど、英名でわかりやすく(?)。
として使い分けてます。

参考にならないかもしれませんが。

【36514】Re:基本なのでしょうが・・・・
発言  かみちゃん  - 06/4/2(日) 12:49 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>また、長いコードになると変数が多くなりすぎて自分でも覚えきれないのですがみなさんはどういう風に変数名をつけているのでしょうか?
>
>私は、個人的には(誰にも教わったことがないのですが)、
>functionは、日本語名で解りやすく。
>汎用する関数は、a,b,i,j,kなど、一般的なやつで。
>使いまわす関数は、cel_positon_x,string_lengthなど、英名でわかりやすく(?)。
>として使い分けてます。

ちょっと気になりましたので・・・
「Visual Basic の名前付け規則」というものがヘルプに書かれています。
http://www.sanynet.ne.jp/~awa/excelvba/kouza/suppl/002.html

なお、変数名、プロシージャ名に日本語など2バイト文字の名前付けは不具合が
発生することが想定されますので、できるだけ英数字の方がベターだと聞いたこ
とがあるので、私は使わないようにしています。
ここの過去ログのサンプルも英数字になっているものが多いと思います。
機能など意味がわからない場合は、コメント文をつけて対処しています。

【36516】Re:基本なのでしょうが・・・・
回答  Kein  - 06/4/2(日) 13:05 -

引用なし
パスワード
   >rangeでセル範囲を選択したり、コピー等を動かそうとすると
コピー等を動かす、というのはどのような処理なのか分かりませんが、みんながよく
間違えることとして

Sheets("Sheet2").Range(Cells(1, 2), Cells(10, 3)).Copy

などという書き方があります。これは

Sheets("Sheet2").Activate
Range(Cells(1, 2), Cells(10, 3)).Copy

ならば問題ありませんが、実際は、これさえもシートを開くことなく

With Sheets("Sheet2")
  .Range(.Cells(1, 2), .Cells(10, 3)).Copy

などと出来ますから、殆ど Active や Select の必要がない、ということに
なります。強いて今、思いついた事例を挙げるとすれば、印刷の総ページ数を
求めるとき

Dim AllP As Integer

Sheets("Sheet2").Activate
AllP = Application.ExecuteExcel4Macro("Get.Document(50)")

などと目的のシートを開いてからでないと、Excel4マクロ関数が使えないという
ぐらいかな・・。

【36523】Re:基本なのでしょうが・・・・
発言  プルート  - 06/4/2(日) 13:44 -

引用なし
パスワード
   ▼エラーやだヽ(´・ω・`)ノ さん:
基本的にSelectしないとダメなものはないと信じてます。
基本的にはですけどね。絶対にないとは思っていません。私が知らないだけです。

オブジェクトに対してメソッドするというのが基本でしょうか。
もしくはオブジェクトに対してプロパティを設定するというのものでしょうか。

だいたいが、オブジェクトをSelectしてるだけなんですよね。
そして、Selectionに対してメソッドしてるって感じなんですよね。マクロ記録は。

だから、Selection=オブジェクトなんですよね。
であればオブジェクト.メソッドとかオブジェクト.プロパティという感じでやってます。私は。

【36541】Re:基本なのでしょうが・・・・
発言  neptune  - 06/4/3(月) 8:47 -

引用なし
パスワード
   日本語の話ですが、
以下は、本家VBでの話になりますが、VBAはそのサブセットですから共通するところが
あると思います。

私が体験したことのある不具合は、
VB5の時、日本語のディレクトリ名を付けたディレクトリ
で作業をすると、不具合が出るということがありまた。
それ以前でも日本語に対する不具合はあったらしいです。

 VB(A)もMade In USAですから、いつ日本語に対する不具合が復活するか
分りません。
ですから、気合の入ったプログラミングに関するディレクトリ名や、
ファイル名は、いまだに8.3形式で付けてしまいますし、変数名、
関数名なんか日本語なんか付けたことありません。
 言語仕様から言って、こういうやり方には是非の意見があると思いますが、
fail-safeとして働くことは間違い無いと思ってます。
いまだに私のようなサガを持った人も多いのではないでしょうか?

【36543】Re:基本なのでしょうが・・・・
発言  Jaka  - 06/4/3(月) 10:11 -

引用なし
パスワード
   ▼プルート さん:
>▼エラーやだヽ(´・ω・`)ノ さん:
>基本的にSelectしないとダメなものはないと信じてます。
グラフ、図形などは、いちいち選択しないと出来ない物もあります。

【36549】Re:基本なのでしょうが・・・・
発言  プルート  - 06/4/3(月) 11:08 -

引用なし
パスワード
   ▼Jaka さん:
>グラフ、図形などは、いちいち選択しないと出来ない物もあります。

Selectしないとダメなものあるとは思いますが、あくまでも「基本的には」Selectしないで、オブジェクト.メソッドとかオブジェクト.プロパティでできると申し上げたまでです。
また、トピ主さんは「rangeでセル範囲を選択したり、コピー等を動かそうとするとよくひっかかってしまいます・・・。」
と書いていることから、もっとも基本的な部分で引っかかっているものと思って書き込みました。
紛らわしい書き込みをして申し訳ありませんでした。

【36554】みなさんご回答ありがとうございます。。
お礼  エラーやだヽ(´・ω・`)ノ  - 06/4/3(月) 11:58 -

引用なし
パスワード
   こんな素人に丁寧に解答してくださってありがとうございます。

やはりselect(activate)しないとエラーがでるというのは私の記述ミスということですね・・・><

ちょうどまたエラーだしちゃったので例示にでも

*********************************************************************
 Set wb = ThisWorkbook
 Set Mws = Worksheets("マスター")
 Set SMws = Worksheets("商品マスター")
 
 Application.ScreenUpdating = False
  SMws.Activate
  SMws.Cells(1, "C").AutoFilter
  Range("A2:BA2").Select
  Range(Selection, Selection.End(xlDown)).Select
  Selection.ClearContents
  Workbooks.OpenText Filename:= _
  mypath & "\Shohin.txt", DataType:=xlDelimited, Tab:=True
  Workbooks("shohin.txt").Activate
  With Workbooks("Shohin.txt").Worksheets("Shohin")
   .Range(.Cells(1, "C"), .Cells(1, "C").End(xlDown)).Copy
   wb.SMws.Cells(2, "A").PasteSpecial Paste:=xlPasteValues←ここでエラー
   .Range(.Cells(1, "D"), .Cells(1, "C").End(xlDown)).Copy
   wb.SMws.Cells(2, "B").PasteSpecial Paste:=xlPasteValues
   .Range(.Cells(1, "O"), .Cells(1, "C").End(xlDown)).Copy
   wb.SMws.Cells(2, "D").PasteSpecial Paste:=xlPasteValues
   .Range(.Cells(1, "P"), .Cells(1, "C").End(xlDown)).Copy
   wb.SMws.Cells(2, "E").PasteSpecial Paste:=xlPasteValues
   .Range(.Cells(1, "Y"), .Cells(1, "C").End(xlDown)).Copy
   wb.SMws.Cells(2, "F").PasteSpecial Paste:=xlPasteValues
  End With
***********************************************************************

これはボタンを押したらtxtファイルからデータを読み込んでthisbookのマスターを更新するという部分なんですが、workbookはacivateで切り替えてからでないとコピーペーストできないのでしょうか?

【36555】Re:みなさんご回答ありがとうございます...
回答  Jaka  - 06/4/3(月) 12:18 -

引用なし
パスワード
   > Set wb = ThisWorkbook
> Set SMws = Worksheets("商品マスター")

>   wb.SMws.Cells(2, "A").PasteSpecial Paste:=xlPasteValues←ここでエラー

 Set SMws = ThisWorkbook.Worksheets("商品マスター")
 SMws.Cells(2, "A").PasteSpecial Paste:=xlPasteValues

【36557】Re:みなさんご回答ありがとうございます...
質問  エラーやだヽ(´・ω・`)ノ  - 06/4/3(月) 13:12 -

引用なし
パスワード
   ありがとうございますー。
うまくいきました!

やっぱりセレクト、コピーペーストの基本的なところが苦手ですorz

 Set wb = ThisWorkbook
 Set Mws = wb.Worksheets("マスター")
 Set SMws = wb.Worksheets("商品マスター")
 
 Application.ScreenUpdating = False

  SMws.Cells(1, "C").AutoFilter
  SMws.Range(SMws.Cells(2, "A"), SMws.Cells(2, "F")).Select←ここでエラーがでる理由が分からない><

SMws.range("A2:F2").selectとかやってもエラーだし・・・・。
みなさまへるみぷぅ

【36559】Re:みなさんご回答ありがとうございます...
発言  Jaka  - 06/4/3(月) 13:58 -

引用なし
パスワード
   基本
1、ブックをアクティブにする
2、シートを選択
3、セルを選択
を順序良く仕事させる。

かっこう良く書こうとしない事。
セル内容のコピペ程度だったら、普通はいちいち選択しません。
すると処理速度が遅くなる。

B4セルに「111」を書くとマクロ記録だと
Range("B4").Select
ActiveCell.FormulaR1C1 = "111"
こんなになりますが、

意味
B4セル選択
アクティブセル(選択したセル)に「111」を記入。

セル選択、選択セルにxxを・・・。
同じだから、
Range("B4").FormulaR1C1 = "111"

こんな風に書けそうだと思わないのがちょっと・・・・。
私もマクロ記録から入ったので、最初はセル選択、アクティブセルに記入ってやってました。
セル選択、アクティブセルって続けて書いたら同じ物じゃん。って、早く気づいてください。

因みに
Workbooks("Book1").Sheets("Sheet2").Activate 〇
Workbooks("Book1").Sheets("Sheet2").Select  ×

【36615】セルを選択するのと選択しないのと速度差...
発言  Jaka  - 06/4/5(水) 15:58 -

引用なし
パスワード
   セルを選択するのと選択しないのと速度差。
test3は特殊ですが。

           速いPCをお使いでしたら、10000にしてみてください。
          ↓注)せいぜい15000まで、それ以上だと配列で問題があるかも。
Const Cnt As Long = 5000

Sub test1()
Dim i As Long
'↓のコードのコメントを外したのも試してみてください。
Application.ScreenUpdating = False
stt = Now()
For i = 1 To Cnt Step 2
  Sheets("Sheet1").Select
  Cells(i, 1).Select
  ActiveCell.Value = i
  Sheets("Sheet2").Select
  Cells(i + 1, 2).Select
  ActiveCell.Value = i + 1
Next
Sheets("Sheet1").Select
Range("C1").Select
ActiveCell.Value = Format(Now() - stt, "hh:mm:ss")
Application.ScreenUpdating = True
MsgBox "終了"
End Sub

Sub test2()
Dim i As Long
stt = Now()
For i = 1 To Cnt Step 2
  Sheets("Sheet1").Cells(i, 1).Value = i
  Sheets("Sheet2").Cells(i + 1, 2).Value = i + 1
Next
Sheets("Sheet1").Range("D1").Value = Format(Now() - stt, "hh:mm:ss")
MsgBox "終了"
End Sub

Sub test3()
Dim i As Long, tb1(1 To Cnt, 1 To 1) As Variant, tb2(1 To Cnt, 1 To 1) As Variant
stt = Now()
For i = 1 To Cnt Step 2
  tb1(i, 1) = i
  tb2(i + 1, 1) = i + 1
Next
Sheets("Sheet1").Range("A1").Resize(Cnt).Value = tb1
Sheets("Sheet2").Range("B1").Resize(Cnt).Value = tb2
Erase tb1, tb2
Sheets("Sheet1").Range("E1").Value = Format(Now() - stt, "hh:mm:ss")
MsgBox "終了"
End Sub

【36638】間違い修正
発言  Jaka  - 06/4/6(木) 10:17 -

引用なし
パスワード
   >'↓のコードのコメントを外したのも試してみてください。
>Application.ScreenUpdating = False

↓のコードのコメントにしたものも試してみてください。

こんな風にコメントにする。
'Application.ScreenUpdating = False

【36645】Re:セルを選択するのと選択しないのと速...
質問  エラーやだヽ(´・ω・`)ノ  - 06/4/6(木) 16:38 -

引用なし
パスワード
   ▼Jaka さん:
>セルを選択するのと選択しないのと速度差。
>test3は特殊ですが。
>
>           速いPCをお使いでしたら、10000にしてみてください。
>          ↓注)せいぜい15000まで、それ以上だと配列で問題があるかも。
>Const Cnt As Long = 5000
>
>Sub test1()
>Dim i As Long
>'↓のコードのコメントを外したのも試してみてください。
>Application.ScreenUpdating = False
>stt = Now()
>For i = 1 To Cnt Step 2
>  Sheets("Sheet1").Select
>  Cells(i, 1).Select
>  ActiveCell.Value = i
>  Sheets("Sheet2").Select
>  Cells(i + 1, 2).Select
>  ActiveCell.Value = i + 1
>Next
>Sheets("Sheet1").Select
>Range("C1").Select
>ActiveCell.Value = Format(Now() - stt, "hh:mm:ss")
>Application.ScreenUpdating = True
>MsgBox "終了"
>End Sub
>
>Sub test2()
>Dim i As Long
>stt = Now()
>For i = 1 To Cnt Step 2
>  Sheets("Sheet1").Cells(i, 1).Value = i
>  Sheets("Sheet2").Cells(i + 1, 2).Value = i + 1
>Next
>Sheets("Sheet1").Range("D1").Value = Format(Now() - stt, "hh:mm:ss")
>MsgBox "終了"
>End Sub
>
>Sub test3()
>Dim i As Long, tb1(1 To Cnt, 1 To 1) As Variant, tb2(1 To Cnt, 1 To 1) As Variant
>stt = Now()
>For i = 1 To Cnt Step 2
>  tb1(i, 1) = i
>  tb2(i + 1, 1) = i + 1
>Next
>Sheets("Sheet1").Range("A1").Resize(Cnt).Value = tb1
>Sheets("Sheet2").Range("B1").Resize(Cnt).Value = tb2
>Erase tb1, tb2
>Sheets("Sheet1").Range("E1").Value = Format(Now() - stt, "hh:mm:ss")
>MsgBox "終了"
>End Sub


サンプルまでつくっていただいて恐縮です。

テストをしてみましたがこんなに速度に差がでるものなんですね・・・><;
ちなみにtest3のマクロが理解できないですorz
もしよろしければご解説をお願いします。

また私が購入した入門本にはワークシートはworksheet(s)と記述するようにあったのですが、これとsheet(s)の違いはなんでしょうか??

厚かましいとは思いますがよろしくお願いします。。

【36648】Re:セルを選択するのと選択しないのと速...
発言  Blue  - 06/4/6(木) 17:26 -

引用なし
パスワード
   ▼エラーやだヽ(´・ω・`)ノ さん:
>また私が購入した入門本にはワークシートはworksheet(s)と記述するようにあったのですが、これとsheet(s)の違いはなんでしょうか??
違いは、Excelの一般操作で、シートの挿入をするときに、
どれを挿入しますか?見たいな画面になると思いますが、あれが全て Sheet になります。

ためしに、グラフシートでも挿入してみて、

Dim sht As Object

For Each sht In Worksheets
  Debug.Print sht.Name
Next
Debug.Print "----------------"
For Each sht In Sheets
  Debug.PRint sht.Name
Next

てな感じのマクロを動かして、イミディトウィンドウに列挙されたシート名に
違いがでるのを確認できます。
ちなみに グラフシート は Chart になります。

【36653】Re:セルを選択するのと選択しないのと速...
発言  かみちゃん  - 06/4/6(木) 22:40 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ワークシートはworksheet(s)と記述するようにあったのですが、これとsheet(s)の違い

以下のURLが参考になりますでしょうか?
http://www.officetanaka.net/excel/vba/sheet/

【36663】Re:セルを選択するのと選択しないのと速...
発言  Jaka  - 06/4/7(金) 11:42 -

引用なし
パスワード
   >ちなみにtest3のマクロが理解できないです
配列を使ってセル範囲にガバッと1度で書き込んでいるだけです。
ただ、配列の大きさに(要素数)が大きすぎると逆に遅いというか、フリーズしたり?ほとんどフリーズしたのと同じ状態になったりします。(1時間ぐらいほっといたらようやく終わったって事もあるので判断が解らない。)
覚えれば色々有効に使えますが、初めはこんがらがるから覚えなくてもいいかも...?

7823 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free