トップページtech
1002コメント361KB

Excel VBA 質問スレ Part41©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net2016/04/27(水) 04:11:46.79ID:Nk+oP5xR
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part40
http://echo.2ch.net/test/read.cgi/tech/1455817784/

※関連スレ
VBAなんでも質問スレ Part2
http://echo.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://echo.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 122
http://echo.2ch.net/test/read.cgi/bsoft/1461287268/
0336デフォルトの名無しさん2016/05/28(土) 01:38:03.64ID:GZWeia2p
>>334-335
試しにデータを以下のように確認してみると、
時刻じゃない日付値が返ってくるのが原因かも

Debug.Print TimeSerial(23, 59, 59.99)
→ 1899/12/31

TimeValue関数で時刻部分だけ取り出すようにしてみては?
Application.OnTime TimeValue(TimeSerial(Hour(Now()), Minute(Now()), 59.99)), "a"
0337デフォルトの名無しさん2016/05/28(土) 03:56:22.62ID:z46njfbn
>>334
まずTimeSerialの秒に59以上を渡したときの動作は未定義だな
これは繰り上がった00秒を返してるっぽいので、23:59:59.99は繰り上がって翌日の日付のある時刻を返してる

Application.OnTimeは、指定された時刻が日付持ってるかどうかで動作を変えてる
日付を持ってないときは当日の指定時刻、日付を持ってるときは指定日付の指定時刻に処理実行

23時59分のときだけ、日付付きの時刻を渡してるが、その日付は過去の日付なので
処理が即実行されてる

まあ多分こういう事じゃないかと
0338デフォルトの名無しさん2016/05/28(土) 08:26:40.26ID:CHU6gzT2
現在vbaの勉強中なのですが、クラスモジュールを使ったプログラム方法を学べる書籍やサイトはありませんか?
0339デフォルトの名無しさん2016/05/28(土) 10:45:40.89ID:+66MKZ0q
>>338
あんまり新しい情報はなさそうだからAriawaseのコードでも読めばどうだろう
0340デフォルトの名無しさん2016/05/28(土) 15:04:42.16ID:gKP/LNYF
オルト+F11 を押とVBEが開きますが
コントロール+F11 を間違えて押と変なタブが作られますがこれは一体何ですか?!!!
0341デフォルトの名無しさん2016/05/28(土) 15:15:08.16ID:g8NfG/nK
>>340
マクロ4.0
vba以前についていたマクロ機能。化石なので使う事はまず無い

ただevaluateだけは何度かこのスレの質問で見たな。使ったことはないけどな
http://officetanaka.net/excel/function/tips/tips57.htm
0342デフォルトの名無しさん2016/05/28(土) 16:10:52.16ID:gKP/LNYF
>>341
ありがとうございます。
03433342016/05/28(土) 20:18:24.66ID:MsTgKpLn
遅れましたが回答ありがとうございます!
修正頑張ります!
0344デフォルトの名無しさん2016/05/29(日) 09:38:21.80ID:AwN+e4jt
Excel2007、2010から2013に移行したんですが、仕様変更?という事でこれまでできていた下記の事ができなくなりました

ユーザーフォームのコマンドボタンを押す→マクロ実行→Application.Visible = True で
ユーザーフォームを非アクティブにして、わざわざシートを一度クリックしなくてもすぐにシートのセルに入力出来るようにしてました

もう2013で再現する事は不可能なのでしょうか?
または違う方法で再現できないでしょうか?
よろしくお願いします
0345デフォルトの名無しさん2016/05/29(日) 13:46:01.40ID:9s1DeJLc
作成依頼です。

シートAのA列にJANコード、B列に商品名が並んでいます。
JANと商品名はA1とB1、A2とB2…と対応しており、データの個数は都度変わります。

欲しいのは以下のVBAプログラムです。

1.シートBのA1のセルにシートAのA1のJANコードを入力し、シートの見出しを「当日の日付+商品名B1」にする。
2.以下、JANコードの数だけシートBをコピーして同じ作業を繰り返す。

です。


その際、
1.シートAとBは同じファイル内にあります。
2.シートBにはA1を検索値としたvlookup関数が入っている。
3.見出しに記載される商品名はJANと対応する商品名。
4.日付は、出来れば「2016年05月29日」なら「160529」と表記させたい。
無理ならどのような表記でも大丈夫ですが、なるべく短く表記したい。


上のファイル自体を今から作るので、シートA、Bの名前は実際には変わります。
またシートBのJANを入力するセルも実際にはA1ではありません。
なので後から変えられるように、プログラムのどこがシートABの名前の部分でどこがシートBのA1を表しているのかも教えてもらえるとありがたいです。

分かる方いらっしゃいましたらよろしくお願いいたします。
0346デフォルトの名無しさん2016/05/29(日) 13:52:33.92ID:m6zFG5bY
>>345
報酬は?
0347デフォルトの名無しさん2016/05/29(日) 17:38:02.13ID:OB5e45ZS
>>345
amazonのせどり関係?
ここまで、やりたい事が具体的に分かれば、この通りすれば出来るんじゃない?
この程度でつまずくなら、厳しいと思うが
データ個数が変わる場合も含めてロジックを組むなら、VLOOKUPは使わない方が良いのでは?
配列なども勉強した方が良いよ
0348デフォルトの名無しさん2016/05/29(日) 17:55:57.68ID:8akYxdWk
>>345
1万でどう?
0349デフォルトの名無しさん2016/05/29(日) 19:22:22.37ID:GTS7K4/T
>>348
お前の半日〜1日分の給料に該当するだろ
ざっと作って30分〜1時間くらいのものに
どれだけ手入れるつもりだよ
0350デフォルトの名無しさん2016/05/29(日) 19:37:22.60ID:DU/FdEem
>>349じゃあ、15分あたり¥8,000でどないでしょう?
延長、指名、同伴オプションも相談のります
0351デフォルトの名無しさん2016/05/29(日) 19:51:23.53ID:IL/FFzdQ
チェンジで
0352デフォルトの名無しさん2016/05/29(日) 19:56:44.56ID:iENwe/Jr
チェンジだってよ
0353デフォルトの名無しさん2016/05/29(日) 20:02:58.52ID:l+XEODYT
スイッチオンで
0354デフォルトの名無しさん2016/05/29(日) 20:52:32.53ID:qZvodTNY
>>349
そんな発想が出るってどんな安い単価の世界で生きてるんだ…
0355デフォルトの名無しさん2016/05/29(日) 20:53:43.81ID:GCJVxvYj
>>345 こんな感じ? http://codepad.org/cLmP8Rt6
0356デフォルトの名無しさん2016/05/29(日) 21:02:37.79ID:O2TO5DJ7
ワン・ツー・スリー
0357デフォルトの名無しさん2016/05/29(日) 21:29:17.79ID:PpnqKVZy
>>349
バカ発見
0358デフォルトの名無しさん2016/05/29(日) 21:31:54.50ID:IxwT55oU
>>349
学生は気楽でいいな
0359デフォルトの名無しさん2016/05/29(日) 22:31:24.29ID:iENwe/Jr
「お前の給料」という表現だったら手取りと解釈するだろうね
0360デフォルトの名無しさん2016/05/29(日) 23:03:21.50ID:9s1DeJLc
>>345です。
レスいただいた方ありがとうございました。
丸投げで申し訳ないと思ったので自分なりに今プログラムを作っています。

>>347
Amazonではないです。
JANに紐付いた商品情報をvlookupで読み込むフォームがあるのですが、毎回シートをコピーしてJANを貼り付けて見出しを変えるという手間が大変なのでVBAを組みたいと思いました。
今VBAを勉強しているところです。

>>355
ありがとうございます。
いただいたプログラム、まだ自分には難しいのですがwithやdate関数の使い方など勉強になります。


とりあえず今のところ、シートをコピーしてJANを貼り付け、見出しを「日付+商品名」にするところまで出来ました。
あとはJANの数だけ上の作業を繰り返すプログラムが出来れば完成です。

自分でやってみて分からなければまた質問します。
ありがとうございました。
0361デフォルトの名無しさん2016/05/30(月) 00:11:04.77ID:MwQPmEOY
>>345です。
連投すみません。奇跡的に出来ました。

ちなみに下のようなプログラムです。

Sub 商品別作成 ()
dim i as integer
i = 2

do until worksheets("リスト").cells(i.1).value = ""
worksheets("原紙").copy after:= worksheets(worksheets.count)
with worksheets(worksheets.count)
.cells(1,2).value = worksheets("リスト").cells(i,1)
.name = year(date) & month(date) & day(date) & worksheets(worksheets.count).cells(1,4)
end with

i = i + 1
loop

end Sub

です。
携帯からの書き込みのため見にくくて申し訳ありません。
手元にあった参考書と>>355さんのプログラムを参考に作りました。

自分で作っておきながらよく理解できていないところもあります。
たとえば、
worksheets(worksheets.count)
がなぜワークシートの末尾という意味になるのか、とか。

長文すみません。ありがとうございました。
0362デフォルトの名無しさん2016/05/30(月) 00:21:17.07ID:MGJW0QKJ
WorkSheetsのカウンタは { 1, ... , N } であり、N = WorkSheets.Count だからでは?
0363デフォルトの名無しさん2016/05/30(月) 00:29:54.80ID:4yKaoPuE
>>361
worksheets.countプロパティにはワークブックの持ってるワークシートの枚数がセットされてて、ワークシートの追加や削除で値が増減する
メインでworksheets(1)って使ってるでしょ? これは1枚目のワークシートの事
ワークシートが5枚あればworksheets.countの値は5になるのでworksheets(5)って指定するのと同じこと
検索すると詳しい解説がいっぱい見つかるから読んでみるといい
0364デフォルトの名無しさん2016/05/30(月) 00:33:15.23ID:TRF4/Pej
>>361
worksheets(番号を表す数値)
ワークシートが3つある場合は、0から2までで表される
番号を表す数値に3を指定すると4番目の新しいワークシートになる

worksheets.countはワークシートの数を表す
つまりワークシートが3つあれば、3となる

よってワークシートが3つあれば、worksheets(worksheets.count)は
worksheets(3)となり0から始まる4番目のワークシートとなるから
ワークシートの末尾と同じことになる
0365デフォルトの名無しさん2016/05/30(月) 01:25:38.78ID:4HMhVwgA
質問なのですが、
2シートある表の比較で、
2行目から比較なので
For i = 2 To Lastrow1 ※1シート目の最終行まで
For j = 2 To Lastrow2 ※2シート目の最終行まで
If Sheet1.Cells(i,2) = Sheet2.Cells(j,2) Then ※2列目に番号があり合ってれば
For i2 = 1 To LastColumn1 ※1シートの最終列まで
If Sheet1.Cells(i,i2) <> Sheet2.Sheet2.Cells(j,i2) Then
Sheet1.Cells(i,i2).Interior.ColorIndex = 3
End If
If Sheet1.Cells(i,i2).Interior.ColorIndex <> xlNone Then
Sheet1.Rows(i).EntireRow.Copy Destination:=Sheet3.Rows(i)
End If
Next i2
End If
Next j
Next i

1シートと2シートを比べ、1シートの差異のセルに色を塗り、
3シート目に行ごとコピーしているのですが、
1シートにしかない行、2シートにしかない行もあり、
それも3シートにコピーしたいのですが、どのようにしたらよいでしょうか?
0366デフォルトの名無しさん2016/05/30(月) 03:35:34.52ID:lz7aZWOJ
>>365
こんな感じかな?

For r1 = 2 To Lastrow1  ' ※1シート目の最終行まで
  flag = True
  For r2 = 2 To Lastrow2  ' ※2シート目の最終行まで
    If Sheet1.Cells(r1, 2) = Sheet2.Cells(r2, 2) Then  ' ※2列目に番号があり合ってれば
      flag = False  ' ※この行はコピーしない
    End If
  Next r2
  If flag Then  ' ※この行は1シートにしかないので
    Sheet1.Rows(r1).EntireRow.Copy Destination:=Sheet3.Rows(r1)  ' ※3シートにコピー
  End If
Next r1

For r2 = 2 To Lastrow2  ' ※2シート目の最終行まで
  flag = True
  For r1 = 2 To Lastrow1  ' ※1シート目の最終行まで
    If Sheet1.Cells(r1, 2) = Sheet2.Cells(r2, 2) Then  ' ※2列目に番号があり合ってれば
      flag = False  ' ※この行はコピーしない
    End If
  Next r1
  If flag Then  ' ※この行は2シートにしかないので
    Sheet2.Rows(r2).EntireRow.Copy Destination:=Sheet3.Rows(r2)  ' ※3シートにコピー
  End If
Next r2
0367デフォルトの名無しさん2016/05/30(月) 04:47:59.06ID:4HMhVwgA
>>366
ありがとうございます。
したい事はできたのですが、
このflagというのはどういう意味なのでしょうか?
0368デフォルトの名無しさん2016/05/30(月) 06:28:58.71ID:MwQPmEOY
>>363
>>364
ありがとうございます。
なるほど。


>>361では本当は「ワークシート1の後にワークシート1をコピーして、コピーしたワークシートに作業する」ということがしたかったんですが、その場合は


Sub 商品別作成 ()
dim i as integer
i = 2

do until worksheets("リスト").cells(i.1).value = ""
worksheets(1).copy after:= worksheets(1)
with worksheets(2)
.cells(1,2).value = worksheets("リスト").cells(i,1)
.name = year(date) & month(date) & day(date) & worksheets(2).cells(1,4)
end with

i = i + 1
loop

end Sub

というプログラムにすれば、ワークシートの名前は関係なしに一枚目をコピーして二枚目に作業する、ということになりますか?
0369デフォルトの名無しさん2016/05/30(月) 08:09:31.18ID:4yKaoPuE
>>368
Worksheets(n)で指定する場合のnは左からみたシートの並びになるらしいので
Worksheets(1).copy after:= worksheets(1) を実行したときには
最新のコピーは常に左から2枚目の位置に来る事とコピー元のシート位置は左端(1枚目)から変えちゃいけない事を
意識できればいいんじゃないかな
0370デフォルトの名無しさん2016/05/30(月) 20:24:27.53ID:dvnyr15v
>>359
「手取り」っていまいちよく理解できないんだよね。
支給額から税金とか差し引いた額ってことだろうけど、
その差し引きく額には会社の団体保険の医療保険とか持ち株会の月額とか寮費とかは含まれるの?
たまに「手取り○万円しか無いんだよ!」って言う人に詳しく聞くと、
上記のようなものも差し引いて実際に自分の口座に振り込まれる額を言う人がいるんだけど、
それって「手取り」って言って正しいの?
0371デフォルトの名無しさん2016/05/30(月) 20:49:50.01ID:9zgDAfYa
>>370
手取りは基本的に保険など差し引いて振り込まれる額、つまり自由に使える金
寮費は微妙だけど、振り込まれる額を指す場合が多いと思う
0372デフォルトの名無しさん2016/05/30(月) 20:50:32.53ID:iGtTjZst
>>370
引くのは税金と健康保険と雇用保険と介護保険じゃね
0373デフォルトの名無しさん2016/05/30(月) 20:57:22.49ID:4q9S9srQ
>>370
確かに契約社員やってる人には
分かり辛いかもしれないね
0374デフォルトの名無しさん2016/05/30(月) 21:11:27.51ID:iGtTjZst
>>372
年金保険もか
0375デフォルトの名無しさん2016/05/30(月) 22:21:18.67ID:VvWJADwM
うちの会社は、関連会社の自動車保険料や寮費を差し引かれた金額が振り込まれる・・・
0376デフォルトの名無しさん2016/05/30(月) 22:26:40.27ID:iGtTjZst
>>375
寮費とかはその人が寮を使ってるからだし
自動車保険も給与から引くようにしなくても良いんじゃね

健康保険とか雇用保険とか年金は全員引かれるもの
VBAとは関係ないが
0377デフォルトの名無しさん2016/05/30(月) 22:28:58.68ID:9zgDAfYa
案件で手取りの話があるのかと思ったら元はただの煽りかよw
真剣に考えて損したわ
0378デフォルトの名無しさん2016/05/30(月) 22:37:26.71ID:VvWJADwM
>>376
給与明細見たら、
組合費、組合積立金、寮の食堂での食費、寮自治会費も給料から引かれてたわ

手取りっていっても会社によって全然ちがうのね
ちな三菱系
0379デフォルトの名無しさん2016/05/30(月) 22:49:20.47ID:JaLXIj0G
会社によっては持ち株とか財形とか色々天引きできる
ただそう言うのまで入れると何の金額のことかワケわからんようになるから手取りってそう言うのは入れないように思う
0380デフォルトの名無しさん2016/05/30(月) 22:50:34.41ID:dvnyr15v
いや、最近読んだ「7年目で手取り11万円」給与明細が大反響 自動車整備士、国家資格で「この待遇?」」の
ニュースと >>359 の「手取り」の文章とで、昔の関連会社の人との会話の中でふと思ったことを
連想して思い出したら書かずにはいられなかっただけなんだ。ごめんよ。
0381デフォルトの名無しさん2016/05/30(月) 22:59:06.74ID:MGJW0QKJ
気にするな
もうすぐボーナスじゃないか
0382デフォルトの名無しさん2016/05/30(月) 23:25:53.51ID:FNI4oSJu
振り込み額を手取りという場合もあるけど
一般的には給与から源泉徴収税、住民税特別徴収、健康保険料、年金保険料、雇用保険料を引いた額
0383デフォルトの名無しさん2016/05/30(月) 23:28:03.40ID:FNI4oSJu
寮費、財形貯蓄、団体生命、団体保険等は任意なのでこれらを差し引く前の額
0384デフォルトの名無しさん2016/05/31(火) 01:17:34.99ID:P+B3hNwu
>>381
何それ、俺の知らない知識だ
0385デフォルトの名無しさん2016/05/31(火) 07:03:20.88ID:lb4BA3Cb
なるほど>>357>>358は派遣ということか
0386デフォルトの名無しさん2016/05/31(火) 11:12:06.88ID:P7zsebxN
お願いします!
double型の配列に数値以外の文字を格納することは出来ませんか?空白と区別出来るものであれば何でも構いません。(-または/がベストな希望)
型をvariantに変えるという手もありますが、計算ミスがあるようなイメージがあるので、やっておりません。何かアドバイスお願いします。
0387デフォルトの名無しさん2016/05/31(火) 11:47:30.66ID:9/vIAIrD
>>386
計算ミスというのは無いと思うが、やはりVariantで型チェックすれば?
または自分でOptional型クラスを作るか。
0388デフォルトの名無しさん2016/05/31(火) 12:07:24.59ID:iuDv2fhM
>>386
そのまま答えるとvariantで格納して呼び出しの時にチェックするしか無いだろう

しかしそれ以前に根本的な設計が間違ってる
やりたいこと書いた方がいいかもしれない
0389デフォルトの名無しさん2016/05/31(火) 14:51:30.75ID:MV3Si3mC
>>387
>>388
ダブルだとやはり出来ないんですね。
稀にマイナス小数点同士の乗算除算や0出現時のエラーがあるのでそれを区別したいと考えてました。
variantでやってみます!
0390デフォルトの名無しさん2016/05/31(火) 21:08:56.37ID:mGubUgmp
>>386みたいな問題って、キングオブ糞なやり方が実際にはうまくいくんだよな
0391デフォルトの名無しさん2016/05/31(火) 21:30:53.23ID:C0QCg+Ll
まー、本当はセルに数値として設定されてるなら普通にDouble型で行けると思うけどね。
まさかセルからTextで値取得しているってオチは無いよね。

ちょっと気になったのがVariant型に入れて数値チェックするのと、
String型に入れて数値チェックしてDouble型に変換して使うのとどっちが早いのか。
まぁ気にするほど差が出ないのは分かっているけど、単純な疑問。

後、Variantに入れると変な暗黙の型に突っ込まれて本来のDouble型と挙動が変わることがないのか心配。
0392デフォルトの名無しさん2016/05/31(火) 21:51:56.92ID:LgcgyNaP
どうせアルゴリズムが遅いのだから実行速度とか気にせん方がええでお前らは
0393デフォルトの名無しさん2016/05/31(火) 22:01:55.92ID:iuDv2fhM
アルゴリズムが遅い・・・?
ふーん、アルゴリズムが遅いんだ〜
0394デフォルトの名無しさん2016/05/31(火) 22:04:20.02ID:mGubUgmp
>>391
単にVariant型に入れた値を数値チェック後に取り出すだけだったら、Stringから変換するよりずっとずっと速いはず。
前者と違って後者は本当の変換だからな。
0395デフォルトの名無しさん2016/05/31(火) 22:09:57.16ID:LgcgyNaP
>>393
せやで、プロとお前らの違いはアルゴリズムなんやで
変数がvariantとかどうでもええねん
0396デフォルトの名無しさん2016/05/31(火) 22:10:12.22ID:C0QCg+Ll
>>394
ただ、Variant型を使うよりString型を使う方が早いんだよね。
型変換でどのくらい相殺されるか
0397デフォルトの名無しさん2016/05/31(火) 22:13:58.47ID:hxNGQcCX
>>389
エスパると丸め誤差のことか?
0398デフォルトの名無しさん2016/05/31(火) 22:15:14.99ID:mGubUgmp
>>396
どういう使い方?
v = 3.1415
より
s = "3.1415"
として使う方が速いって意味?
0399デフォルトの名無しさん2016/05/31(火) 22:40:22.39ID:P0axz30G
>>344
俺もこれ知りたい
VBAからセル選択してもフォーカスはコントロールに行ったままだよな
0400デフォルトの名無しさん2016/05/31(火) 23:58:45.09ID:b/p0i84S
>>399
Excel 2013持っていないから試せないけど
APIでフォアグラウンドウィンドウを変えてみるとかは?

Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Sub CommandButton1_Click()
 SetForegroundWindow Application.hWnd
End Sub
0401デフォルトの名無しさん2016/05/31(火) 23:59:23.43ID:C0QCg+Ll
>>398
そう。

http://officetanaka.net/excel/vba/speed/s6.htm
0402デフォルトの名無しさん2016/06/01(水) 00:08:55.15ID:v2Wj2/bB
>>401
いやそのリンク先は
s = "3.1415"
としたあとsを文字列のまま扱うときの話でしょ

>>391で「String型に入れて数値チェックしてDouble型に変換して使う」ってのが元の話
だからsをDoubleに戻すコストがいる。
0403デフォルトの名無しさん2016/06/01(水) 00:11:50.06ID:9sIb/BNE
>>399
いったんfalseにしてからtrueにするのは試した?
0404デフォルトの名無しさん2016/06/01(水) 00:28:41.02ID:f68tak/j
>>402
だからその型変換に掛かる時間と相殺してどちらが早いかという話。

数値チェックはどちらにしたって必要でしょ。
0405デフォルトの名無しさん2016/06/01(水) 00:46:14.53ID:v2Wj2/bB
>>404
なるほど
じゃ、明示的な数値チェックを略すと

Dim s As String
Dim v As Variant
Dim d As Double

s = 3.1415   ' ← 型変換(1)
d = s      ' ← 型変換(2)

v = 2.7183  ' ← 型変換(3)
d = v     ' ← 型変換(4)

としたときのコストは (1) + (2) >> (3) + (4) だ
、っていうのが>>394の主張。
0406デフォルトの名無しさん2016/06/01(水) 02:19:56.12ID:f68tak/j
>>405
そうやって並べてみると、
セルから取って来てVariant型に入れた
値は内部型でDouble型とは限らないから
結局は型変換が必要になるな。

後、Objectならともかく、こっちは
Doble型に変換するなら暗黙の変換使わずに
明示的な変換を行う想定でいたわ。

d = CDbl(s)     ' ← 型変換(2)

d = CDbl(v)     ' ← 型変換(4)
0407デフォルトの名無しさん2016/06/01(水) 07:17:59.36ID:v2Wj2/bB
>>406
うん、まあセルに入っている値が大多数は数値で、たまに変なエラーみたいなものが入っている前提とすると、

d = CDbl(s)     ' ← この型変換は常に重い

d = CDbl(v)     ' ← この型変換はたまに重い

となるね。(sはString型なので常に関数呼び出し)
0408デフォルトの名無しさん2016/06/01(水) 07:58:53.15ID:J5oSfmPv
>>407
よく分からないんだけど、例えばセルから取得した値をVariantが内部型をLong型とかに判断した場合って型変換は起こるんじゃないの?
0409デフォルトの名無しさん2016/06/01(水) 08:50:59.51ID:weg166lE
実測してみれば良いんじゃないかな
0410デフォルトの名無しさん2016/06/01(水) 09:02:22.06ID:akJUj8WN
質問です。
特定のフォルダに、ファイル(エクセルBook)が登録(保存、ペースト)された時に
VBAで記述した処理を起動したいのですが、どうすれば良いのでしょうか?
0411デフォルトの名無しさん2016/06/01(水) 12:22:55.53ID:K88eWt2g
>>410
API使ってタイマーで前回の状態と比較するしか無いんじゃなかろうか。

VB.Netなら確かfilesystemwatcherが使えた気がするけど、それでも難しいよ。

何せExcelファイルはファイルサーバとかに置いて共有切ったりすると、暫く違うファイルに前回状況を抱えて出力したりしてるからね。

簡単なことならいいけど、色々やろうとすると途端に難しくなる。
0412デフォルトの名無しさん2016/06/01(水) 17:11:37.67ID:E/1ScAaT
型変換するコストより、数値チェックするコストの方が圧倒的高い気がするんだが
チェックしないで例外拾うのも、例外処理のコストが高い気がするし

実測したわけじゃないから気がするだけかもしれんが
0413デフォルトの名無しさん2016/06/01(水) 18:33:41.83ID:9sIb/BNE
そんなチマチマしたこと考えるより、速いPCと速いSSDをドドーンと用意すればいいだけじゃないの?
そもそもそんなに速度が重要ならVBAは向いていないって話だしな。
0414デフォルトの名無しさん2016/06/01(水) 19:29:44.69ID:weg166lE
>>410
VBAだけでは難しいかも
0415デフォルトの名無しさん2016/06/01(水) 19:49:31.29ID:sRCfCf1w
VBAは純粋に処理速度遅いからなぁ。

出来合いの物同士を結んで駆動させるにはすごく便利なんだけど、
単体で何か作ろうってのは無理だな。
0416デフォルトの名無しさん2016/06/01(水) 20:29:22.31ID:NX6RE2hb
その用途でもVBA使いづらくない?
0417デフォルトの名無しさん2016/06/01(水) 21:07:08.13ID:v2Wj2/bB
>>410
ボタンを押してからフォルダの監視を始めて、ファイルが登録されるまでほっといていいんなら
単に無限ループにすればいいと思うけど?
0418デフォルトの名無しさん2016/06/01(水) 21:07:46.48ID:IfpgImxc
まーでもさ、SQL一発で処理出来て俄然速くなりそうなところを
VBAで三重ループとかして何とかしているコードとか見かけると
もう脱力感を通り越して微笑ましいよな
0419デフォルトの名無しさん2016/06/02(木) 03:58:28.00ID:0gMFQogn
質問したいんだけどかなり長くなるし
規模がそれなりになりそうでレス消費激しくなりそうなんだけど
別にスレ立てたほうがいい?
0420デフォルトの名無しさん2016/06/02(木) 06:34:02.28ID:uPQC6lrS
スレ立てて5レスくらいで終わったらどうするんだ
0421デフォルトの名無しさん2016/06/02(木) 06:38:04.75ID:jAQjQwIo
そんな時は知恵袋
0422デフォルトの名無しさん2016/06/02(木) 08:21:37.06ID:x3+LLHfF
>>419
とりあえず質問内容書いちゃいなよ
ダメだったら回答がないだけで
他になんのリスクもないじゃん
04234102016/06/02(木) 11:18:28.49ID:E1zOmXKj
>>411、414、417
レスありがとうございます。
他の方法考えてみます。
0424デフォルトの名無しさん2016/06/02(木) 12:23:31.19ID:0gMFQogn
>>419 だけど質問させてもらうわ

VBAで.CSVの中にある特定の文字列を書き出して右のセル、特定の文字列を書き出して右のセル・・・
とやって言ってある文字列が来たら下のセルの端から・・・という風なものを作りたいんだけど
0425デフォルトの名無しさん2016/06/02(木) 12:36:06.49ID:jr36f/Tp
csvが対象で文字列操作だけで済むならpythonかruby使え
0426デフォルトの名無しさん2016/06/02(木) 12:38:46.39ID:PrMOVFII
テキストストリームで開いて、
1行ずつ読み込んで、
1行をカンマで分解して、
分解した文字列を比較して、
スキップするのか右に書き出すのか改行するのか処理して、
全行読み込み終わるまで繰り返せばいい。
0427デフォルトの名無しさん2016/06/02(木) 13:42:52.85ID:0gMFQogn
>>426
なるほど 流れは理解できた
1行をカンマで分解ってどうすればいいんだ?

なんども質問して悪いね
0428デフォルトの名無しさん2016/06/02(木) 13:56:01.35ID:f0lhMNCN
Split関数
0429デフォルトの名無しさん2016/06/02(木) 14:03:22.31ID:PrMOVFII
その分だとCSVが結構曖昧なファイル形式と言うことも知らないよね?
大まかに文字通り「カンマ文字で区切られているテキストファイル」程度の縛りしかなく、
カンマ自体を文字列として扱う表現方法とか、
ダブルクォーテーションをどう扱うかとか、
改行コードも区切り文字として扱うのかとか、
そういった決まりが標準として存在してはいないことを注意した方がいいよ。
エクセルに読ませるCSVファイルの作成者とのファイル形式の詳細の確認をしておかないと誤動作する。
あと文字コードとかね。
0430デフォルトの名無しさん2016/06/02(木) 14:26:09.67ID:MCmPKbwB
とりあえず、ここくらいは知っとけ
http://www.pc-master.jp/sousa/csv.html
0431デフォルトの名無しさん2016/06/02(木) 14:27:01.89ID:0gMFQogn
>>429 親切にありがとう
確かにCSVってファイルの存在がよくわかってないのは事実だわ
文字が入ってるファイル 程度の認識だった
0432デフォルトの名無しさん2016/06/02(木) 17:08:58.17ID:H/+hHucZ
まあ俺ならCSVファイルのままどうこうしないで1回シートに落とすけどな
0433デフォルトの名無しさん2016/06/02(木) 17:20:17.63ID:QOEnZCBh
powershellが良いぞ
0434デフォルトの名無しさん2016/06/02(木) 18:34:23.67ID:VAHYdxVD
>>432 に1票
CSVのパースまで自分でやるならVBA使う意味ないじゃんw
ExcelにCSVのデータをセルに配置してもらって
自分で好きなようにいじって
最後にまたExcelにCSVとして書き出してもらいたいからVBAなのでは
0435デフォルトの名無しさん2016/06/02(木) 19:41:25.29ID:Q6rF1mtD
>>434
100万行以内ならそれだな
■ このスレッドは過去ログ倉庫に格納されています