トップページ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/
0268デフォルトの名無しさん2016/05/17(火) 19:17:20.83ID:Ju7Z8cl/
if Sheet3.Cells(i,2) = Sheet2.Cells(fnd.Row,2) Then
Else
Sheet3.Cells(i,2)interior.ColorIndex = 3
End If
はいらなかったです。失礼しました。
0269デフォルトの名無しさん2016/05/17(火) 20:15:20.61ID:YEbHD3bH
switch文使うとか?
0270デフォルトの名無しさん2016/05/17(火) 20:24:22.15ID:Ju7Z8cl/
>>269
switch文とはどのように使うのでしょうか?
今調べて見てるのですが・・・
0271デフォルトの名無しさん2016/05/17(火) 20:33:31.31ID:uw1YLM9D
>>267
せめて Then Else は条件逆にしたら?

> For i = ? To Lastrow ※Sheet3の最終行
>  Set fnd = Sheet2.Columns(2).Find(Sheet3.Cells(i,2))
>  If Not (fnd Is Nothing) Then
>  If Sheet3.Cells(i,1) <> Sheet2.Cells(fnd.Row,1) Then
>    Sheet3.Cells(i,1).Interior.ColorIndex = 3
>   End If
>  If Sheet3.Cells(i,2) <> Sheet2.Cells(fnd.Row,2) Then
>    Sheet3.Cells(i,2).Interior.ColorIndex = 3
>   End If
>  If Sheet3.Cells(i,3) <> Sheet2.Cells(fnd.Row,3) Then
>    Sheet3.Cells(i,3).Interior.ColorIndex = 3
>   End if
>      ・
>      ・
>      ・
>   If Sheet3.Cells(i,20) <> Sheet2.Cells(fnd.Row,20) Then
>    Sheet3.Cells(i,20).Interior.ColorIndex = 3
>   End if
>  Else
>   Sheet3.Cells(i,2).EntireRow.Interior.ColorIndex = 4
> End If
> Next i
0272デフォルトの名無しさん2016/05/17(火) 20:35:42.07ID:Ju7Z8cl/
>>271
そうでした。申し訳ありません。
わざわざ=で、Elseを入れる意味はないですね。
その上で、このIf文をもう少しまとめる方法はないでしょうか?
0273デフォルトの名無しさん2016/05/17(火) 21:09:16.27ID:Bh5kVr4X
この内容だと単純にループで回せば出来そうだけど

For i = 1 To Lastrow '※Sheet3の最終行
  Set fnd = (Sheet2.Columns(2).Find(Sheet3.Cells(i, 2)))
  If Not (fnd Is Nothing) Then
    For j = 1 To 20 '★1列目から20列目まで?
      If Sheet3.Cells(i, j) <> Sheet2.Cells(fnd.Row, j) Then
        Sheet3.Cells(i, j).Interior.ColorIndex = 3
      End If
    Next
  Else
    Sheet3.Cells(i, 2).EntireRow.Interior.ColorIndex = 4
  End If
Next i
0274デフォルトの名無しさん2016/05/17(火) 21:29:43.68ID:kv5Z22Gc
>>270
switch文はif then elsif elsif ...
に相当するものだった

列も2〜20までforで回したら?
for i to lastrow
for j = 2 to 20
if 条件 then
endif
next j
next i
0275デフォルトの名無しさん2016/05/17(火) 21:35:27.61ID:Ju7Z8cl/
>>273
Set fnd = (Sheet2.Columns(2).Find(Sheet3.Cells(i, 2)))
  If Not (fnd Is Nothing) Then
の部分をFor j = 1 To 20 の中に入れてましたが、
よく考えたら、一度検索して見つかったらその行を確認していってるので、
中に入れてたら、何度もヒットさせる余計な処理になってしまってました。
ありがとうございました。
0276デフォルトの名無しさん2016/05/17(火) 21:42:55.17ID:Ju7Z8cl/
>>274
ありがとうございました。
それだけでよかったですね。
0277デフォルトの名無しさん2016/05/19(木) 15:21:44.50ID:hJ/G9SOx
FindのAfterという引数を変数で指定した場合、変数にはセルの値が入っているとして、
その値が入っているセルの位置情報が記憶され、そこから検索がかかるという認識で
よいのでしょうか?
0278デフォルトの名無しさん2016/05/19(木) 16:33:50.64ID:oZsWPLv6
ここに書いてある通り
https://msdn.microsoft.com/ja-jp/library/office/ff839746.aspx
google とかでexcel vba find とか検索すれば出てくる
0279デフォルトの名無しさん2016/05/20(金) 17:13:57.06ID:P6F1ZDVP
>>278
ID変わりましたが、返信遅くなりました。
そこは見ているのですが、何故変数にはセルの値が入っているのに、セルの場所を指定した事になるのかと思いまして、質問させていただきました。
0280デフォルトの名無しさん2016/05/20(金) 18:50:53.92ID:gsWAgsom
>>279
FindのAfterは値じゃなくて、セル範囲の情報なども含むRangeオブジェクトだよ
Findの戻り値も同じくRangeオブジェクトになる

Rangeオブジェクト
https://msdn.microsoft.com/ja-jp/library/office/ff838238.aspx
0281デフォルトの名無しさん2016/05/20(金) 21:49:54.04ID:d/ZNR8o9
コンソールで
?"a"&"b"

ab
と出力されますが
?"a"&1

a 1
と出力されます
なぜ半角スペースが交じるのでしょうか?
0282デフォルトの名無しさん2016/05/20(金) 22:04:33.27ID:RvnBIaae
>>281
? "a"&10
a 8
? "a"&100
a 64
? "a"&1000
a 512

後はわかるな?
0283デフォルトの名無しさん2016/05/20(金) 22:14:31.20ID:d/ZNR8o9
>>282
すいません、さっぱりわかりません。
? 100
100
? "a" & 100
a100
?"a"&100
a 64
?"a100"
a100
?"b"&100
b 64
?"x"&100
x 64

010が2byteで64かなーというのは想像できますが、
何故こうなるのでしょうか
0284デフォルトの名無しさん2016/05/20(金) 22:20:25.08ID:Pie8/Dil
>>281
?"a"&1  を
?"a" & 1 のように
&の前後に空白を入れてやれば"a1"と出力される

試しにコード上で
Debug.Print "a"&1   と&の前後に空白なしで記述すると
Debug.Print "a"; &O1 に自動変換されるので

おそらく文字型と数値型の2つの型のデータが出力されている
数値型データの場合、先頭に空白が入る模様
0285デフォルトの名無しさん2016/05/20(金) 22:33:41.48ID:d/ZNR8o9
>>284
なるほど
&N01
&P01
ではだめで
&O01
でいいのは何ででしょう?
0286デフォルトの名無しさん2016/05/20(金) 22:39:11.93ID:Pie8/Dil
先頭 &O の数値は8進数
先頭 &H の数値は16進数
0287デフォルトの名無しさん2016/05/20(金) 22:39:59.19ID:RMEVZVQK
>>285
&O は8進数
0288デフォルトの名無しさん2016/05/20(金) 22:50:42.69ID:d/ZNR8o9
>>286-287
ありがとうございます!
こういうのは数値リテラルというのでしょうか?
0289デフォルトの名無しさん2016/05/20(金) 23:18:49.15ID:V/0gJxiW
?"a"&100*-1
a-64
0290デフォルトの名無しさん2016/05/21(土) 01:56:41.84ID:DHWj1BOs
>>284
>数値型データの場合、先頭に空白が入る模様
先頭は符号。正の符号が空白で表されてる
0291デフォルトの名無しさん2016/05/21(土) 18:06:47.94ID:8UwytgDT
質問です。
Min,max関数で最小、最大値を求める作業を複数のcsvファイルで行いたい場合どのようにすべきでしょうか?
具体的には=max(a2:a56)という動作をを1000個のcsvファイルに対してまとめて行い、各csvファイルの最大値を1つのファイルにまとめる動作を行いたいです。
1000個csvファイルのデータの位置(a2:a56)は同じです。
このような動作を行うマクロは組むことができるのでしょうか?
Vba始めてばかりなので間違いなどあればすみません。
0292デフォルトの名無しさん2016/05/21(土) 18:31:55.59ID:3PJd0Iym
>>291
マクロの記録をしてそれを繰り返せば良い
0293デフォルトの名無しさん2016/05/21(土) 19:00:55.32ID:2DvXotsF
>>280
またIDが変わってしまったのですが質問者です。
申し訳ありません。そのセル範囲を含む情報が含まれるということは、
どういうことなのでしょうか?
例えば、1列目を指定してFindで検索し、
検索した結果見つかったセルの値をaに入れたとします。
1列目に検索したいものが複数あり再検索したい場合、
再度、Findを記述するかFindNextでAfterにaを指定すると思いますが、
そのaのセル範囲を含む情報というのは、何を示しているのでしょうか?
0294デフォルトの名無しさん2016/05/21(土) 21:23:45.26ID:a3pocFu9
>>293 ('A`)

Dim a As Range
Set a = Range("A1:A10").Find("検索文字列")
 ↑で、A1のセルがヒットしたとする場合
 ↓下記と同義のRangeオブジェクトが変数aに設定される
Set a = Range("A1")

Range プロパティ (Excel)
https://msdn.microsoft.com/ja-jp/library/office/dn301006.aspx

で、Rangeオブジェクトにはセルに関するいろんなプロパティを保持している
a.Value   '<-セルの値(既定プロパティ)
a.Address  '<-セルの参照範囲
a.Row    '<-セルの行番号
a.Column  '<-セルの列番号


Findメソッドがどのプロパティを参照しているかは知らないが
Afterに指定されたセル(※Rangeオブジェクト)の行番号、列番号
もしくはアドレスから次の検索セルを判断していると思われる
0295デフォルトの名無しさん2016/05/21(土) 21:53:40.84ID:2DvXotsF
>>294
F8やF5で実行を止めながら確認しても、aには値しか見えないですが、
実はRangeオブジェクトが入っているという事なのですね。

それはExcelの仕様という事なのでしょうか?
0296デフォルトの名無しさん2016/05/21(土) 22:46:05.51ID:a3pocFu9
>>295
変数の詳細な内容が見たいなら
ローカルウィンドウ なり ウォッチウィンドウ で確認するといい

Excel VBA 入門講座 ローカルウィンドウ
http://excelvba.pc-users.net/fol8/8_2.html
Excel VBA 入門講座 ウォッチウィンドウ
http://excelvba.pc-users.net/fol8/8_3.html
0297デフォルトの名無しさん2016/05/21(土) 22:47:52.19ID:DHWj1BOs
>>295
それデフォルトプロパティが見えてるだけ
ちゃんとウォッチ式追加してウォッチウィンドウで見てみろ
0298デフォルトの名無しさん2016/05/21(土) 23:20:54.65ID:2DvXotsF
>>296 
>>297
了解しました。ありがとうございます。
今確認してみてるのですが、
列指定してFindし、その結果を元に再検索に再度FindのAfterで
最初の検索結果を指定しその次から検索していますが、
空白が指定された場合、ちゃんと表の範囲内を検索し、
先頭に戻ってくれているのは確認できました。
結果としては非常にありがたいのですが、何故そうなるのかがわかりません。
列は指定しましたが、表の範囲は指定していないのに・・・
0299デフォルトの名無しさん2016/05/22(日) 01:20:39.82ID:RVVHScN0
この先延々と質問が続くのかな
0300デフォルトの名無しさん2016/05/22(日) 01:38:56.00ID:vMk8bbvq
もちのロン
0301デフォルトの名無しさん2016/05/22(日) 02:16:59.30ID:aOwEm8Rg
>>299
>>300
質問者ですが、この件に関してはこれで最後にします。
申し訳ありません。
0302デフォルトの名無しさん2016/05/22(日) 09:40:44.20ID:vMk8bbvq
質問スレなんだから、
質問すればよろし

回答するスレではないんで、
回答するのは気分次第だけどな
0303デフォルトの名無しさん2016/05/22(日) 10:36:35.32ID:F3XVlBde
ググったり色んな本読んで調べたんですが、解決しなかったんで質問させてください

Application.Dialogs(xlDialogSendMail).〜

でアクティブブックをそのまま.xlsmとして添付メールすることはできるのですが、送り先にxlsに変換して送りたいです
FileFormat的な処理をしてワンクッション無しでそういった事を、するのは可能でしょうか?
宜しくお願いします
0304デフォルトの名無しさん2016/05/22(日) 11:40:55.24ID:viRK9kIz
>FileFormat的な処理をして
>xlsに変換して
>アクティブブックを〜ことはできる
>ワンクッション無しで

ワンクッションとは?
0305デフォルトの名無しさん2016/05/22(日) 12:37:39.34ID:F3XVlBde
>>304
コマンドボタンワンクリックで済ませたいので、一つのイベントプロシージャに収めたいという事です
もし別の処理をしないと不可能だという事でしたら、もう一つボタンを追加したりして対応したいと思いますが、何かいい方法がありましたらご教授お願いします
0306デフォルトの名無しさん2016/05/22(日) 12:55:07.15ID:MkPG05kK
>>291
素人だけど書いてみた Excel2003/Vistaで動作確認
http://codepad.org/h9iBcEZo
1列目のある範囲の最大値だけなんでCSVをワークシートへは取り込んでない
動作おかしかったらリスト読んで適当に直して
0307デフォルトの名無しさん2016/05/22(日) 14:00:36.34ID:uwOrwjCq
>>305
SaveAsで一旦.xls(xlExcel8形式あたり)で保存してから送信すれば行けるんじゃね
0308デフォルトの名無しさん2016/05/23(月) 19:14:37.25ID:+L6Gybj9
ExcelでInterfaceを使用して多重実装って行うことは出来ますか?
0309デフォルトの名無しさん2016/05/23(月) 20:04:34.59ID:fFz6fB8+
>>308
あんた・・・それは
やめた方が
いいな!
0310デフォルトの名無しさん2016/05/23(月) 23:02:51.54ID:EBQbKa6e
>>309
自己解決したのですが
ちなみに止めた方がいい理由って何ですか?
気になります
0311デフォルトの名無しさん2016/05/23(月) 23:05:46.46ID:OgrQhKAM
どう解決したかの方が気になります
0312デフォルトの名無しさん2016/05/23(月) 23:40:18.70ID:fFz6fB8+
>>310
もう考えない方がいい
どうしてもだ!
スレの住人として
忠告する!
じゃあ俺は
これで・・・またな
0313デフォルトの名無しさん2016/05/23(月) 23:44:12.90ID:zjNqCcoU
>>311
結論からいうとできました
Implements は複数設定できるので
後はそれぞれのインターフェースを
実装すれば良いだけでした
0314デフォルトの名無しさん2016/05/25(水) 19:58:38.92ID:vZFTiHPJ
>>292
亀レスすみません。
マクロの記憶だと作業中のファイルのみしかマクロが機能しないのでは無いでしょうか?
また、1000個のファイルに対して一つ一つマクロ実行するのは大変なので、1000個のcsvファイルの最大値を一つのファイルにまとめる作業を、一度に出来る方法は無いのでしょうか?
0315デフォルトの名無しさん2016/05/25(水) 20:22:35.58ID:tfoRBKUB
>>314
対象が同じフォルダに入っているファイル全部とかだったら別にどうってことなくね?
0316デフォルトの名無しさん2016/05/25(水) 20:48:22.69ID:RqoGasre
作りの簡単なcsvっぽいしExcel使うよりJSとかVBSとかPoweSellとかPythonとかRuby使った方が早そう
0317デフォルトの名無しさん2016/05/25(水) 21:45:43.06ID:1qBlGVzr
>>315
レスありがとうございます。
315さんの言う通り、対象は同じフォルダに入ってるファイルすべてです。
どうってこと無いというのは、やり方が簡単という事でしょうか?
宜しければ、マクロの記憶を繰り返す以外にもう少し具体的に教えていただければ幸いです。簡単な例文や使用すればいい関数など...
最近vbaを始めたばかりで、まだrangeやif文を習った程度の知識でして...
あと、拡張子にcsvが付いてたのでcsvファイルと言ってたのですが、対象となるのは普通のエクセルのファイルです。


>>316
ありがとうございます。
検討してみます。
0318デフォルトの名無しさん2016/05/25(水) 22:41:50.45ID:enDBv6qD
>>317
拡張子がcsvのファイルをテキストエディタで開いてみたら?

excel vba for
をググって繰り返しのやり方を調べる

試しに3個のファイルを対象にして作ってみる
0319デフォルトの名無しさん2016/05/25(水) 23:17:20.71ID:CznCF+TX
>>314
1度にやる方法は無いかと言われれば
無いこともないけど、本当にその方法が有効かはまた別問題。

例えばADO接続でCSVファイルからSQLで値を取得するときは
フォルダがDB、その中にある各CSVファイルがテーブル扱いになるので、
そのフォルダ内の対象になるCSVファイル名を先に全て取得しておいて
SQLでUNIONで繋げておけばできるけど、
本当にそれが速くて簡単かは相当疑問が残るよね。
0320デフォルトの名無しさん2016/05/25(水) 23:21:01.56ID:Uf48Qhpg
>>317
とりあえず、1つのファイルに対する処理を完成させる

後はループ処理で更新するファイルを変えつつ↑の処理を繰り返す

ところでループ処理は判ってんの?
do until とか
0321デフォルトの名無しさん2016/05/25(水) 23:39:18.00ID:tfoRBKUB
> そのフォルダ内の対象になるCSVファイル名を先に全て取得

もしかしてこれがネック?
03223172016/05/25(水) 23:42:26.41ID:1qBlGVzr
レス頂いた方々、ありがとうございます。
ご回答いただいた方法で試してみます。
0323デフォルトの名無しさん2016/05/26(木) 00:10:51.15ID:tOkM+sU0
>>314
306に書いたんだけど動かなかったの?
ファイル名の取得は306のプロシージャでできるはず
csvじゃなくてxlsを読むならfunctionのところを自分なりに書き換えろ
0324デフォルトの名無しさん2016/05/26(木) 03:19:58.19ID:tOkM+sU0
>>314
xls読込みの追加と306でのcsv読込関数の訂正をあげとく
http://codepad.org/syUhdaGh
ExecuteExcel4Macro って命令使うともっと早くなるらしいけど
俺にはうまく使えなかった
CSVの方が早いので用意できるならCSVファイルで処理した方がいいと思う
他の人も言ってる様にスクリプトなんかも使いやすいし
0325デフォルトの名無しさん2016/05/26(木) 07:35:57.45ID:yzIVgV2w
>>324
>ExecuteExcel4Macro って命令使うともっと早くなるらしいけど

Microsoftからとっくにサポート打ち切られているようなの持ち出すのやめれ
0326デフォルトの名無しさん2016/05/26(木) 08:48:16.33ID:EV8ndBzb
2007あたりでマクロの記録で一部ExecuteExcel4Macroが記録される
ってあったようだけど、今は無くなってる?
0327デフォルトの名無しさん2016/05/26(木) 10:01:25.13ID:tOkM+sU0
>>325
>Microsoftからとっくにサポート打ち切られているようなの
ここなんかは Office 2013 and later って書いてるけど今は打ち切られたのか?
https://msdn.microsoft.com/ja-jp/library/office/ff193589.aspx
0328デフォルトの名無しさん2016/05/26(木) 14:46:41.03ID:TLCYm3V6
最近VBAを勉強し始めた初心者です。
参考書に、離れた行や列を非表示にするにはRangeプロパティのあとにEntireを使いましょうとあります。
RangeプロパティのあとにいきなりRows.Hidden=Trueとしても意図していた作業ができるのですが、Entireはなぜ必要なのでしょうか。
0329デフォルトの名無しさん2016/05/26(木) 15:31:24.30ID:UrTJJdUS
>>325
>>327書いたんだけど ExecuteExcel4Macro って互換性維持の為だけにあるみたいなんだね
後々使えなくなるって意味で言ってたって事がようやく理解できた
変な事書いてすまんかった
0330デフォルトの名無しさん2016/05/26(木) 15:44:42.47ID:Dvh4dhBn
>>328
安全のためだからできるんならいらないんじゃね
0331デフォルトの名無しさん2016/05/26(木) 20:16:50.15ID:lgiuDAuh
>>328
Rowsは連続した行しか指定できないけど、EntireRowsは離れた行を指定できるからじゃね。
0332デフォルトの名無しさん2016/05/27(金) 01:04:42.25ID:gB8QuuHH
>>328
Hiddenに関しては特に問題ないだろうけど、
部分的なセル範囲を含む“行全体”を厳密に扱いたいなら
EntireRowの方が安全かな

Debug.Print Range("A1:A3").EntireRow.Address
 → $1:$3
Debug.Print Range("A1:A3").Rows.Address
 → $A$1:$A$3
Debug.Print Rows("1:3").Address
 → $1:$3
0333デフォルトの名無しさん2016/05/27(金) 23:11:50.47ID:4UuWR9R4
>>330-332
遅くなりましたが、皆さんありがとうございます!
なにぶん初心者なもので、下手にオリジナリティを出さずに慣れるまでは公式に則ってきちんと学ばなければと思いました

またお世話になるかもしれませんが、そのときは何卒よろしくお願いします
0334デフォルトの名無しさん2016/05/28(土) 00:22:34.85ID:MsTgKpLn
Application.OnTime TimeSerial(Hour(Now()), Minute(Now()), 59.99),
03353342016/05/28(土) 00:24:50.50ID:MsTgKpLn
23:59分台に入るとバグって更新を続けてしまうのですが、原因はなんでしょうか?
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というのはどういう意味なのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています