Excel VBA 質問スレ Part32
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/10/07(月) 22:19:55.86★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Applications』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
前スレ:Excel VBA 質問スレ Part31
http://toro.2ch.net/test/read.cgi/tech/1376371376/
関連スレ:VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/
0175デフォルトの名無しさん
2013/12/13(金) 17:39:04.38なんでVBAの入門書読まないの?
0176デフォルトの名無しさん
2013/12/13(金) 17:43:54.25インターネットでいろいろ検索して入門書も読んでいるのですがこれをこうすると地がうことになるというような説明はされていなくて。
とにかくそういうものだと理解して使うのは出来るのですが気になって。
0177デフォルトの名無しさん
2013/12/13(金) 18:23:45.100178デフォルトの名無しさん
2013/12/13(金) 18:51:13.050179デフォルトの名無しさん
2013/12/13(金) 19:19:53.04だからそもそも別の命令
前者のCopyがRangeのコピーする命令
後者のCopyがWorkSheetsのコピーする命令
違う命令なんだから違う結果になっても当たり前だろ
0180デフォルトの名無しさん
2013/12/13(金) 21:21:12.26君は「異なるオブジェクトの同名のメソッドは別のものだ」ということを
理解していない。(たぶん「どちらも同じ関数を呼ぶ」とでも思っているのだろう)
だから >>175 の突っ込みを入れられたのだ。
0181デフォルトの名無しさん
2013/12/13(金) 21:28:45.320182デフォルトの名無しさん
2013/12/13(金) 21:38:01.35>>180
>>181
ありがとうございました。
特に>>180のおっしゃる通りで、それについてはほとんど何も理解していませんでした。
0183デフォルトの名無しさん
2013/12/14(土) 00:36:28.14どこで質問すればいいのか分かりません。
Excelのアドイン 「XLL」 をC++で作成しようと思っているのですがセルに可変文字列を返すとき
普通はfreeとかdeleteとか使うのですが関数として戻り値を返す前にdeleteできないので
どうすればいいかと考えています。
0184デフォルトの名無しさん
2013/12/14(土) 00:47:16.86忍者のレベルを上げるとか・・・。
面倒なので上記の質問を取り下げます。
ご迷惑をおかけしました。
0185デフォルトの名無しさん
2013/12/14(土) 01:55:30.97オブジェクトやクラスの型が違うと、
同じ関数名でも、動作が全然違う
例えば、車オブジェクトの走ると、
猫オブジェクトの走るは、全然違う
入門書を買って、読んだほうが速い
総合的・段階的に学べるし
0186他のブックのセルからコピペするコード
2013/12/14(土) 14:42:31.13Sub test()
Dim book1 As Workbook
Dim str As String
Set book1 = Workbooks("b.xls")
str = book1.Worksheets("Sheet1").Range("a1:c1").Value
Range("a1:c1").Value = str
End Sub
2つのブックがありまして
ブックb.xls の a1:c1 に書かれている数値を
ブックa.xls の a1:c1 へコピペするコードを書いてますが、
上のコードですと Dim str As String の型がエラーを起こしますが
何という型にすればいいのでしょうか?(無提議で動いてますが)
また上記のコードをなるべく変数を使わずにもっと完結に記述することは可能でしょうか?
宜しくお願い致します。
0187186
2013/12/14(土) 15:14:38.18自己解決しました
Sub test()
Range("a1:c1").Value = Workbooks("b.xls").Worksheets("Sheet1").Range("a1:c1").Value
End Sub
こう書けば動きましたが
変数を割り当てる必要なんて微塵もないですね。w
参考にしたサイトが悪かったのか・・ なんで変数を使って解説してるのか謎です、、
0188デフォルトの名無しさん
2013/12/14(土) 16:28:59.64"変"数だからな
プログラム中で中身変えたり、使いまわしたりするのに都合がいいから使うんだよ
そう言った事が全くなければ変数なんていらんが、そう言うプログラムはあんまりない
0189デフォルトの名無しさん
2013/12/14(土) 18:08:55.53Range("a1:c1").Valueは配列。配列をString型に入れようとすればエラーだわな
セル範囲の値を変数に入れるには Dim str As Variant
コピーなら同じ範囲を指定して Sheets(X).Range("a1:c1").Value = str として
もよいが、それなら >> 187 で十分。
セル範囲をVariant変数に入れる本来の目的は str(1, 1) が a1 , str(1, 3) が
c1 の値 といった配列で扱えることにある。
そしてこれはExcelVBAでは非常に有効なテクニックでもある。
0190デフォルトの名無しさん
2013/12/14(土) 18:21:29.08それを本来の目的って言うのは違うだろ
0191デフォルトの名無しさん
2013/12/14(土) 18:43:33.71一番うまくまとまっている解説サイトはどこですか?
0192186
2013/12/14(土) 19:29:03.71>>188
ご丁寧な解説ありがとうございます。大変勉強になりました。
同じ処理を行や場所を変えて繰り返しやるときは変数を使うのが有効なようですね。
0193デフォルトの名無しさん
2013/12/14(土) 22:11:17.25Dim の変数提議の場所について教えてほしいのですが
IF 等条件によっては使わない場合がある変数は
Elseなどの結果のコードの直前に書いても問題ないでしょうか?
使わない変数もすべて先頭に並べておく必要があるのでしょうか?
0194デフォルトの名無しさん
2013/12/14(土) 22:26:29.75MSのガイドラインには、1行に1つずつとは書いてあるけど、宣言の位置については記述が見当たらない
こういうのは真面目に論ずると宗教戦争になるんで、その場ごとに先輩に合わせとけ
0195デフォルトの名無しさん
2013/12/14(土) 22:31:27.06この話題は荒れる
0196193
2013/12/14(土) 22:53:56.18>>194
>>195
初心者的の素人考えかもしれませんが
既に複雑化しているコードの中に追加でIFやCaseで命令をお試しで付け足す場合に
先頭に書いてあると消すときに少し手間がかかったり
しばらく触ってなかったら何の提議か忘れてしまったりする場合もあるかと思うのですが
直前に書いておけば一目瞭然で消す時も簡単ですし処理的にもIFの結果を先読みしていなければ
読み込まれないのでごくわずかでしょうが処理が軽減されるのではないかと思いました。
0197デフォルトの名無しさん
2013/12/14(土) 23:01:48.05提議じゃなくて定義な
双方にメリットとデメリットがあって、優劣が決まらないから荒れるんだよ
初心者なら議論に参加して、そういうのを再確認するのは無駄ではないと思うけど、
このスレでは何度も同じ話題がループしてるんで、常連はもう飽き飽きしてる
0198193
2013/12/14(土) 23:30:51.83>定義 失礼しました。。
なにやら振れてはいけない話題であったようですね
今書いているVBAは仕事ではなく趣味の週末データー解析ですので
動作に問題がないようでしたら自分のやりやすいように書く事にします。
ありがとうございました。
0199デフォルトの名無しさん
2013/12/14(土) 23:33:55.42先頭で定義する「必要」はないよ。(宣言必須なら)その変数を使うまでに宣言すればいい
>>194
そのガイドラインってのが何を指してるか知らんが
すくなくともヘルプのDimステートテメントには
>プロシージャ内で Dim ステートメントを使用する場合は、通常、Dim ステートメントをプロシージャの最初で記述します。
と書いてあるわけだが
>>196
お前一人が見るプログラムならどこで定義してても良いよ
他人も見るプログラムなら、ルール決めてそれを守れば良い
おそらく定義だけの位置では処理速度は変わらん
プロシジャ単位で実行時にコンパイルするからな
New付きで定義したらどうなるかはしらん
0200デフォルトの名無しさん
2013/12/14(土) 23:51:09.23http://10up.20ch.net/s/10mai2010845.png
0201デフォルトの名無しさん
2013/12/15(日) 01:56:07.75基本的に、なら、例外的に、で返せるが。
なんて邪推か。とりあえず上に書いておくのが慣例よ。
各自都合のいいルールを模索しそれに従ってください。程度だろうね。
自動で半角スペースの処理が行われてしまうみたいに、
宣言句は関数の上の方に移動させられてしまうわけでもないし。
0202デフォルトの名無しさん
2013/12/15(日) 01:56:59.76シーぷらぷらスレでエクセルネタとしてレスするのが無難加藤
0203デフォルトの名無しさん
2013/12/15(日) 01:57:31.300204デフォルトの名無しさん
2013/12/15(日) 02:11:46.970205デフォルトの名無しさん
2013/12/15(日) 02:43:02.74何が?
forみたいなシステムに最初から入ってるキーワードがForになるのを防ぐ方法はないよ
0206デフォルトの名無しさん
2013/12/15(日) 08:49:33.250207デフォルトの名無しさん
2013/12/15(日) 09:05:07.040208デフォルトの名無しさん
2013/12/15(日) 10:09:18.120209デフォルトの名無しさん
2013/12/15(日) 15:47:09.25VBEエディターで置換をするときに
改行を含まない1行のコードのみ置換できるようですが
複数行をまとめて置換する方法は無いのでしょうか?
0210デフォルトの名無しさん
2013/12/15(日) 16:15:10.27無理
0211デフォルトの名無しさん
2013/12/15(日) 17:13:17.83モジュールを30個ほど連結させたのですが
全モジュールの特定の箇所に数行コードを追加したいときに
複数行置換ができたら1発でできるのになあと思いましたが。
1モジュールだと他のエディターで置換して戻せばいいですが
モジュールが別れていて数が多いとひたすらコピペを正確に繰り返すしか手がないようで骨折れまくってます。
0212デフォルトの名無しさん
2013/12/15(日) 18:23:31.030213デフォルトの名無しさん
2013/12/15(日) 19:13:37.07っていうか、ある程度長いコードは最初から外部エディタ使うだろ
内蔵エディタは編集機能が貧弱すぎて話にならない
0214デフォルトの名無しさん
2013/12/15(日) 19:34:13.78>モジュールを30個ほど連結させたのですが
>1モジュールだと他のエディターで置換して戻せばいいですが
30モジュールを連結して1モジュールにしたのではなくて?
というか30回繰り返す程度ならたいした手間ではないような・・・
0215デフォルトの名無しさん
2013/12/15(日) 22:35:19.55三行目と四行目には空行があるよ。行間を嫁。
30Mod時なら1Mod丸々置換すればいいが、と言っている
0216デフォルトの名無しさん
2013/12/15(日) 22:37:54.88>モジュールが別れていて数が多いとひたすらコピペを正確に繰り返す
ここか。ここがbefore/afterをわからなくさせてるな。ごめん>>214。
0217デフォルトの名無しさん
2013/12/15(日) 22:40:25.310218デフォルトの名無しさん
2013/12/15(日) 22:46:29.720219デフォルトの名無しさん
2013/12/15(日) 22:48:22.390220デフォルトの名無しさん
2013/12/17(火) 22:45:22.58WorksheetFunction.Matchで照合の型を-1で、降順に並び替えれば
うまくいきますが、データは昇順の状態で
一年前の最古のデータ行を拾う方法ありますか?
昇順のままで照合の型を-1だと当然失敗します
(最新のデータを拾ってしまいます)
いろいろ調べたのですが、いい方法がみつかりませんでした
どなたかいい方法ありませんか?
0221デフォルトの名無しさん
2013/12/18(水) 07:31:12.64一年前の最古って何?
仮に今日が2013/1/1なら一年前の最古って何年何月何日なの?
0222デフォルトの名無しさん
2013/12/18(水) 14:19:06.90けっこうたくさんのFormを使ってるんですが動きが遅くなるのを心配してるんですが。
0223デフォルトの名無しさん
2013/12/18(水) 18:48:52.04「一年前」の「最古のデータ」だろ
地で曲解するタイプか
0224デフォルトの名無しさん
2013/12/18(水) 20:35:53.78と解釈したが。どうするかはわからぬ。
0225デフォルトの名無しさん
2013/12/18(水) 22:59:15.70エスパー検定受けるつもりも無いんで、下手に日本語でアレコレ言うくらいなら具体的な例を上げて説明して欲しいっすな
0226デフォルトの名無しさん
2013/12/18(水) 23:25:43.80データの何かの日付が2012/1/1のもののうち一番古いデータだろ、たぶん
まあまともなレス欲しいならそのデータのシート例だせと
0227デフォルトの名無しさん
2013/12/19(木) 00:15:07.120228220
2013/12/19(木) 01:48:39.04最古って表現が適切でなかったですね
0229デフォルトの名無しさん
2013/12/19(木) 07:38:05.88いえいえ、私達の助言のおかげで解決できて良かったです
0230デフォルトの名無しさん
2013/12/19(木) 08:25:55.401.エンドユーザー向けに配布するEXCEL
2.項目(150位)を入力して、エラーをチェックして最終的にCSVを吐き出す
3.区分などはCombboxで実装(区分値の追加はたまに発生する)区分は30個ほど
4.入力した複数の条件でコード値を取得する処理あり
5.マルチランゲージ(ただし、日本と海外は別ブック)
項目(150位)のセル位置管理、エラー処理
区分値の管理はどうしたらいいと思いますか?
自分の知識で考えた結果は
項目の管理
→TXTにパラメーターをもたせて、ブックを開いたタイミングでクラスオブジェクト(自作)
に落として、collectionで管理する
区分の管理
→Accessをローカル配置して、ブックを開いたタイミングで更新
0231デフォルトの名無しさん
2013/12/19(木) 18:02:06.46>項目(150位)のセル位置管理
決め打ち
セルに名前つけて名前で管理
セル位置と処理内容の対応シート作って管理
>エラー処理
好きなようにしろ
>区分値の管理
区分値用のシートに書いとく
俺ならEXCELで配布するならそのブックだけで完結するようにするが
区分の管理は一括なのかローカルなのかとか、色々考える事が多くて何とも言えん
まあ、好きなようにしろとしか
0232デフォルトの名無しさん
2013/12/19(木) 18:24:22.860233デフォルトの名無しさん
2013/12/20(金) 16:12:59.17いつ切り捨てするのかよくわかりませんでした。
計算は1度計算したのをさらにかけたり割ったりします。
ここで、
最初にかけ算→小数点切り捨て→かけ算
なのか
かけ算→かけ算→割り算など全部した後いっきに切り捨てた方が良いのか
前者でやっていたんですがこの2つだと当然答えも違ってきますよね
普通どっちが正解なんですか?
0234デフォルトの名無しさん
2013/12/20(金) 16:33:59.75普通は、計算誤差というものに思いを馳せる
0235デフォルトの名無しさん
2013/12/20(金) 16:39:27.59レスありがとうございます
もしあなたが先生だったら回答はどちらにしますか?
0236デフォルトの名無しさん
2013/12/20(金) 16:43:08.850237デフォルトの名無しさん
2013/12/20(金) 16:48:03.001 / 3 * 3を計算して下さい。
0238デフォルトの名無しさん
2013/12/20(金) 16:56:45.30もう冬休み入っちゃって。
あーもう単位落としそうで心配だよお
0239デフォルトの名無しさん
2013/12/20(金) 17:50:29.510240デフォルトの名無しさん
2013/12/20(金) 18:07:18.650241デフォルトの名無しさん
2013/12/20(金) 18:12:45.79その中から特定の日付を見つけたいんですが(実際は日付そのもの
ではなく、その日付のある行を知りたい)、Findの使い方を教えて
ください
Dim target As Range
Set target = Range("A3:A150").Find(What:="2012/3/01", LookIn:=xlValues, LookAt:=xlWhole)
MsgBox target.Row ←
とすると、実行時エラー:91
オブジェクト変数またはWithブロック変数が設定されていません
ってエラーが←のところで発生します。
0242デフォルトの名無しさん
2013/12/20(金) 18:14:17.26="2012/3/1"
0243241
2013/12/20(金) 18:20:00.05テスト用のシートではその日付はA80にあるんですがね
0244デフォルトの名無しさん
2013/12/20(金) 18:24:49.950245デフォルトの名無しさん
2013/12/20(金) 19:39:52.680247241
2013/12/20(金) 20:20:20.05日付を変数として先ほどのものに与えるのはどうするんでしょうか?
Dim dt as Date
として
dt = 日付
Set target = Range("A3:A150").Find(What:=#dt#, LookIn:=xlValues, LookAt:=xlWhole)
とすると構文エラーになるんですが。
0248デフォルトの名無しさん
2013/12/20(金) 20:35:51.50いつ切り捨てするのかよくわかりませんでした。
計算は1度計算したのをさらにかけたり割ったりします。
ここで、
最初にかけ算→小数点切り捨て→かけ算
なのか
かけ算→かけ算→割り算など全部した後いっきに切り捨てた方が良いのか
前者でやっていたんですがこの2つだと当然答えも違ってきますよね
普通どっちが正解なんですか?
0249デフォルトの名無しさん
2013/12/20(金) 20:57:48.50「#〜# で囲む」 と「"〜" で囲む」 の意味の違いが判っていないからその質問になる。
0250241
2013/12/20(金) 21:27:42.490251デフォルトの名無しさん
2013/12/20(金) 22:40:03.70日付リテラル って書いても分からないと思うにで少し解説しておく
VB(A)では#で囲まれた日付と時刻は日付型(Date)の定数になる。("で囲めば文字リテラル・・文字型の定数)
よってWhat:=#3/1/2012# は日付型(Date)をWhatに指定していることになる。
これは
Dim dt As Date
dt = "2012/3/1"
・・・・・What:=dt,・・・・
と同じことになる
ちょっと書きすぎた。ついでに数値リテラルなども勉強しておくのが吉と思う
0252デフォルトの名無しさん
2013/12/20(金) 22:55:40.45あ〜、なるほど〜
その辺りは全然勉強してませんでした
ありがとうございますm(__)m
0253デフォルトの名無しさん
2013/12/21(土) 12:12:08.22なにに処理時間がかかってるかを調べたいのですが
どうするのが得策ですか?
なにが原因かがわかればあとはこちらでコードを改良します。
なので原因の調べ方。
0254デフォルトの名無しさん
2013/12/21(土) 12:27:40.19質問があまりにもざっくりしすぎ
原因も対処法もたくさんありすぎる
まず最初にマシンスペックを確認する
CPUの速度やメモリの量など
0255デフォルトの名無しさん
2013/12/21(土) 12:35:51.56その前後に時間を表示するようにして見てみるとか
というか1分も我慢できないとかwだったらExcelでやるんでなく実行ファイル(exe)作ってそれでやるようにしたら?
0256デフォルトの名無しさん
2013/12/21(土) 12:55:19.70をあちこちに入れまくる
0257デフォルトの名無しさん
2013/12/21(土) 14:12:00.66Application.Calculation = xlManual
0258デフォルトの名無しさん
2013/12/21(土) 14:13:25.50アルゴリズムが悪い
質問のレベルから見てあきらか
0259デフォルトの名無しさん
2013/12/21(土) 14:30:17.09むずか死ね
0260デフォルトの名無しさん
2013/12/21(土) 14:56:17.82そのまま「せっせせっせ」とWordに貼り付けたいんですが
どういうコードを書けばいいですか?
Wordにはページの上から下へそのまんま東の順番で並べ、表と表の間は改行を1行だけ挿入します。
0261デフォルトの名無しさん
2013/12/21(土) 16:46:02.95★zipファイルの「阪神無」フォルダー以下
「平成25年10月」の数値未発表で一部合計値比較不可能の為
平成25年9月〜平成13年4月は以下の各駅を合計・増減から除外して再計算。
「阪神」─「本線」─「阪神梅田」〜「千船」
「阪神」─「なんば線」─「大阪難波」〜「出来島」
★zipファイルの「阪神有」フォルダー以下
除外せず、「平成25年10月」の未発表数値を前年同月(平成24年10月)と同一と仮定
※「Hnn(年度)」…平成(nn-1)年4月〜平成nn年3月
※「中之島」「渡辺橋」「大江橋」「なにわ橋」…「H21」10月の[総数]は日割り(13/31日) 。
※「大阪難波」「桜川」「ドーム前」「九条」…「H21」3月の[総数]は日割り(12/31日) 。
※「総数」…「H18」の7月以降及び年度平均はOTS線を除いた数値となっている。
平成24年4月〜平成25年10月
http://www.city.osaka.lg.jp/toshikeikaku/page/0000020916.html
[2013年12月20日]
http://www.city.osaka.lg.jp/toshikeikaku/cmsfiles/contents/0000020/20916/6-2.xls
平成24年3月〜平成13年4月
http://www.city.osaka.lg.jp/toshikeikaku/page/0000164566.html
[2013年6月4日]
http://www.city.osaka.lg.jp/toshikeikaku/cmsfiles/contents/0000164/164566/12-6.xls
0262デフォルトの名無しさん
2013/12/21(土) 16:58:15.50スクロールも選択もできなくはなるけど
リストはグレーアウトしないの?
コンボボックスはグレーアウトするのに
0263デフォルトの名無しさん
2013/12/21(土) 19:08:01.72そういうコードを書けばいい
何がわからないんだ
0264260
2013/12/21(土) 20:14:42.98具体的には?
Selection.Copyまではわかるが、そのあとはこんな感じか?
Selection.Copy Destination:=Word.Documents(1).ActiveCursor
0265デフォルトの名無しさん
2013/12/21(土) 21:18:08.98多分ワードに直接貼り付けとか出来ないと思う
一旦クリップボード経由させるのが楽なんじゃね
0267デフォルトの名無しさん
2013/12/23(月) 01:32:23.38ユーザーフォームにコマンドボタンAとBがあって
Aをクリックするとデータの抽出
Bをクリックするとデータを抽出した後、特定のデータに色をつける
この場合、BにAと同じ構文を書いた後、色付けしてるのですが
省略ってできないでしょうか?
あまりに長くなるのでなんとかしたいです
0268デフォルトの名無しさん
2013/12/23(月) 03:31:36.24「Sub 抽出」を用意しといて、Aからは抽出を呼び出すだけ
Bは抽出を呼んだあと色付けするようにプログラムを作ればいい
0269デフォルトの名無しさん
2013/12/23(月) 08:32:52.21データの抽出
End Sub
Private Sub btn_B_Click()
データの抽出
データに色付け
End Sub
Sub データの抽出()
End Sub
Sub データに色付け()
End Sub
0270デフォルトの名無しさん
2013/12/23(月) 10:39:37.720271デフォルトの名無しさん
2013/12/23(月) 14:10:40.000272デフォルトの名無しさん
2013/12/23(月) 16:33:14.05ありがとうございました。
全体がすっきりしました。教えてくれた方、素敵です。
0273デフォルトの名無しさん
2013/12/24(火) 12:07:04.760274デフォルトの名無しさん
2013/12/24(火) 12:08:07.16いつも中央に寄っています。
■ このスレッドは過去ログ倉庫に格納されています