トップページ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/
0154デフォルトの名無しさん2016/05/07(土) 15:00:10.35ID:1wAcRjrQ
>>153
んじゃ、ここでピントの合ったレスをID:8kiHQWJTがどうぞ
0155デフォルトの名無しさん2016/05/07(土) 15:35:39.10ID:nzotyd+v
プロならMSDNやオンラインヘルプだけで十分
紙だろうが電子だろうが書籍の出番なし
0156デフォルトの名無しさん2016/05/07(土) 16:20:40.94ID:PC4ZOeic
そんなことより
オフラインのヘルプ日本語版が欲しい
0157デフォルトの名無しさん2016/05/07(土) 16:27:15.49ID:6qCtvFTs
初級者ならオフラインヘルプ書籍だけで十分
電子オンラインヘルパーさんの出番なし
0158デフォルトの名無しさん2016/05/07(土) 17:34:52.23ID:sN4H5bv9
>>155
ドン引き
0159デフォルトの名無しさん2016/05/07(土) 17:49:10.43ID:1Difn6h5
プロのくせに独力解決できず、オンラインでヘルプミーするとかどうよ
0160デフォルトの名無しさん2016/05/07(土) 18:04:13.20ID:QutgNX3W
>>156
Office 2013 VBA用オフライン ヘルプ ファイルが欲しい場合〜開発時に役立ちます! - 元「なんでもエンジニ屋」のダメ日記
http://nasunoblog.blogspot.jp/2013/11/office-2013-vba.html

これではダメ?
0161デフォルトの名無しさん2016/05/07(土) 22:11:16.28ID:sN4H5bv9
>>159
出ていってくれ
0162デフォルトの名無しさん2016/05/08(日) 00:54:50.32ID:ikF8GjeW
>>160それ英語版や〜ん
0163デフォルトの名無しさん2016/05/08(日) 01:10:44.31ID:HXCktBbn
えっこの程度の簡単な英語も読めなでプログラミングしてるの
日本語ヘルプなんて誤訳だらけで役に立たないのに
0164デフォルトの名無しさん2016/05/08(日) 04:17:19.71ID:ikF8GjeW
じゃぁさ、>>163の文章を英語で書いてみてよ?!
0165デフォルトの名無しさん2016/05/08(日) 06:04:10.40ID:d67L2ADZ
書いてみてよだって ププ
0166デフォルトの名無しさん2016/05/08(日) 08:58:00.55ID:7UXL6x+W
Oh, English with this easy degree can also be read, and is it being stroked and programed?
Japanese help isn't useful full of mistranslation.
0167デフォルトの名無しさん2016/05/08(日) 09:40:20.29ID:cY3IZjLs
Hey, you dare work on programming
with poor ability not to read this easy English?
The MSDN document in Japanese translation doesn't help!
0168デフォルトの名無しさん2016/05/08(日) 10:20:00.62ID:MurkxjfX
英語初心者は、Oh を文頭につけたがる
こなれた感を必死に出そうとして滑稽
Oh 坊やと英語板では呼ばれている
0169デフォルトの名無しさん2016/05/08(日) 10:45:47.51ID:NRyLEpvc
>>166
>>168
ですってyo
0170デフォルトの名無しさん2016/05/08(日) 11:33:31.06ID:rP7gnQo6
CellのメンバーであるFormulaについて調べようと思って英語の記事読んでたら
最後の方で「セルに書く方の関数の事やんけ!」ってなった事はある。
0171デフォルトの名無しさん2016/05/08(日) 11:35:57.16ID:7UXL6x+W
>>168
文句はエキサイト翻訳に言えばいいと思うよ...

恥ずかしい奴 w
0172デフォルトの名無しさん2016/05/08(日) 13:08:20.31ID:cY3IZjLs
>>171
Hey, you dare work on programming
with poor ability not to WRITE this easy English?
The translation service of Excite doesn't help!
0173デフォルトの名無しさん2016/05/08(日) 14:12:42.71ID:6KbaYcKf
クラスを使って、その集合をあるプロパティの値でソートして、どういう形にせよ順番にならべるにはどうしたらいいでしょうか?

具体的なたとえで言いますと
Personというクラスからたくさんオブジェクトをつくり
その1つのプロパティであるBirthDayで生年月日順で人を並べたいのです。
0174デフォルトの名無しさん2016/05/08(日) 14:29:53.33ID:QvSZMceu
いきなり質問で申し訳無いのですが、
With Sheet3
Sheet1.Range(
0175デフォルトの名無しさん2016/05/08(日) 14:30:54.84ID:QvSZMceu
いきなり質問で申し訳無いのですが、
With Sheet3
Sheet1.Range("A1").CurrentRegion.Copy .Range("A1")

With .Range("A1").CurrentRegion
.AdvancedFilter xlFilterInPlace,Sheet2.Range("A1").CurrentRegion
.SpecialCells(xlCellTypeVisible).Clear
End With

.ShowAllData

For a=.Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
If .Range("A" & a)="" Then
.Rows(a).RntireRow.Delete
End If
Next a

End With

Sheet1とSheet2を比較し、変更があったところをSheet3にコピーしているのですが、
変更箇所がわかるようにセルの色を変えたいのですが、どうしたらよいかわからず
困っています。わかる方いらっしゃいますでしょうか?
0176デフォルトの名無しさん2016/05/08(日) 14:35:59.31ID:QvSZMceu
Rntire⇒Entire です。失礼しました。
0177デフォルトの名無しさん2016/05/08(日) 14:36:08.66ID:ZUgYOGn0
>>173
インデックス[0〜n-1]の配列をプロパティ順にソートしておく。
対象のクラスオブジェクトの配列を、先ほど作っておいたインデックスに沿ってpermutateする。
0178デフォルトの名無しさん2016/05/08(日) 15:05:36.92ID:E74hVYZW
>>173
シートにインスタンスオブジェクトを識別するIDと
プロパティをA列、B列に入力して
プロパティの列目でソートする
ID列の値でアクセスする

インスタンスオブジェクトはdictionaryに格納してIDをキーにしておく
0179デフォルトの名無しさん2016/05/08(日) 15:08:58.84ID:E74hVYZW
>>175
if文で比較して違ったらrange.interior.colorプロパティを変えるとか

書き方が判らないのはマクロを記録してみたら判ると思うけど?
0180デフォルトの名無しさん2016/05/08(日) 15:12:38.09ID:rP7gnQo6
>>173
Sub Test(Person, Collection)
i = 1
If Collection.Count Then
For i = i To Collection.Count
If Person.BirthDay < Collection(i).BirthDay Then Exit For
Next
End If
Collection.Add Person, , i
End Sub

>>175
Sub Test(Sheet1, Sheet2, Sheet3)
s1d = Sheet1.UsedRange.Value
s2d = Sheet2.UsedRange.Value
For i = LBound(s1d, 1) To UBound(s1d, 1)
For j = LBound(s1d, 2) To UBound(s1d, 2)
If s1d(i, j) <> s2d(i, j) Then
Sheet1.Cells(i, j).Interior.Color = RGB(255, 0, 0)
Sheet1.Cells(i, j).Copy Sheet3.Cells(i, j)
End If
Next
Next
End Sub
0181デフォルトの名無しさん2016/05/08(日) 15:12:56.95ID:QvSZMceu
>>175
おそらく
With .Range("A1").CurrentRegion
.AdvancedFilter xlFilterInPlace,Sheet2.Range("A1").CurrentRegion
.SpecialCells(xlCellTypeVisible).Clear
End With
の間に入れるのだろうとは思ったのですが、うまくいきません。

if文で比較というのは、ShowAllDataの前に入れるってことですか?
0182デフォルトの名無しさん2016/05/08(日) 15:44:19.75ID:QvSZMceu
>>180
ありがとうございます。

Sub Test(Sheet1, Sheet2, Sheet3)
の部分は、シート名をいれるのでしょうか?
0183デフォルトの名無しさん2016/05/08(日) 15:47:12.37ID:rP7gnQo6
>>182
Worksheetオブジェクトを入れる。
0184デフォルトの名無しさん2016/05/08(日) 16:01:33.95ID:QvSZMceu
>>182
one=Worksheet("Sheet1").UsedRange.Value
としているのに、For分のLBound(one,1)の所で配列がありませんと出てしまいます。
0185デフォルトの名無しさん2016/05/08(日) 16:45:05.73ID:MWz94FDA
リンクの埋め込みについてですが
自動記録で試したところ

ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="Sheet2!A1"

このようなコードが出てきたのですが
選択中のセルに実行する命令では無くセル番地で実行する場所を指定したいのですが、一体どう書けばいいのでしょうか?
0186デフォルトの名無しさん2016/05/08(日) 17:43:54.77ID:Uh7lvDUN
>>185
excel vba セル 番地 指定 でググる
0187デフォルトの名無しさん2016/05/08(日) 17:49:35.23ID:B17gXYq2
>>185
ActiveSheet.Hyperlinks.Add Anchor:=ActiveSheet.Range("B1"), Address:="", SubAddress:="Sheet2!A1"
0188デフォルトの名無しさん2016/05/08(日) 18:50:05.07ID:LbMOyLBe
>>187
>>186
ありがとうございます。
0189デフォルトの名無しさん2016/05/08(日) 21:28:50.28ID:Mc3+72Z/
丸投げのお願いで申し訳ありませんが、下記の作業ができるVBAプログラムが欲しいです。

隣り合ったふたつのセルを結合したいのですが、
1.セルA1とB1を結合
2.セルA2とB2を結合
3.以降、任意の行まで同じ作業を繰り返し
4.AB列で作業が終わったら次はCD列でも同じ作業
5.CD列が終了したらEF列に移動
6.以降、任意の列まで同じ作業を繰り返し

です。

その際結合させるふたつのセルにはそれぞれ値が入っていますが、活かすのは左のセルの値です。
結合の際の「右上のデータが〜」というメッセージは無視したいです。
どなたかお分かりの方がいらっしゃいましたらお願いします。
0190デフォルトの名無しさん2016/05/08(日) 22:06:12.34ID:to9qHxlC
結合って文字列の結合じゃなくてセルの結合か
0191デフォルトの名無しさん2016/05/08(日) 22:14:16.85ID:to9qHxlC
>>189
こんな感じ?

For cc = 1 To Selection.Columns.Count Step 2
For rr = 1 To Selection.Rows.Count
Selection.Cells(rr, cc + 1).Value = ""
Selection.Range(Cells(rr, cc), Cells(rr, cc + 1)).MergeCells = True
Next
Next
0192デフォルトの名無しさん2016/05/08(日) 22:47:03.73ID:Mc3+72Z/
>>191
さっそくのご回答ありがとうございます。
今から試してみます。
0193デフォルトの名無しさん2016/05/08(日) 23:07:29.52ID:Mc3+72Z/
>>191
書いていただいたVBAをコピペして試しましたが、セルをひとつ結合しただけで終わってしまいました。
0194デフォルトの名無しさん2016/05/08(日) 23:09:23.84ID:Mc3+72Z/
結合したい範囲を選択して実行したら希望通り動きました。
ありがとうございます!
0195デフォルトの名無しさん2016/05/10(火) 01:32:49.02ID:IdRScl5y
以前全く別の場所で教えてもらったExcelのVBAで意味が理解できないところがあり、おわかりに
なられるのであれば、意味を教えていただきたいのですが、

For a = 2 To Lastrow1 ※Lastrow1はSheet1の最終行
@Set fnd =(Sheet2.Columns(14).Find(Sheet1.Cells(a,4).Value)
if Not (fnd Is Nothing) Then
Day=DateSerial(2000,1,1)
num=Sheet2.Cells(fnd.Row,14).Value
fad=fnd.Address
Do
If Sheet2.Cells(fnd.Row,12).Value > Day Then
a2=fnd.Row
Day=Sheet2.Cells(a2,12).Value
End If
Set fnd = Sheet2.Columns(14).FindNext(fnd)
Loop While Not fnd Is Nothing And fnd.Address <> fad And Sheet2.Cells(a2,14).Value=num

Sheet2の12列目には日付が入っており、14列目には番号が入っています。
それを一致させているのはわかるのですが、特にLoopを抜ける条件のところが
理解できません。おわかりになる方はいらっしゃいますでしょうか?
0196デフォルトの名無しさん2016/05/10(火) 02:05:42.50ID:wnAOqKt0
以下の条件の時はLoopし続ける
Not (fnd Is Nothing)            → fnd変数がNothingでは無い
And (fnd.Address <> fad)         → かつ fndセルのアドレスがfadと一致しない
And (Sheet2.Cells(a2,14).Value=num) → かつ Sheet2.Cells(a2,14).Valueとnumが一致

つまり以下の場合にLoopから抜ける
・fndがNothingになった時
・または fndセルのアドレスがfadと一致した時
・または Sheet2.Cells(a2,14).Valueとnumが一致しない
0197デフォルトの名無しさん2016/05/10(火) 02:21:30.80ID:IdRScl5y
>196
ありがとうございます。
Set fnd = Sheet2.Columns(14).FindNext(fnd)
で最初の検索から、更に同じ番号のセルがないかを検索して、
見つかった場合は、fnd内にその見つかった番号が入ると思うのですが、
そうなると、検索で番号が見つかっているので既に番号の一致はとれていて、
更にSheet2.Cells(a2,14).Valueとnumの番号の一致をとっているのは、
2重で一致をとっていることになるのでしょうか?
文章が下手ですみません。
0198デフォルトの名無しさん2016/05/10(火) 03:51:15.80ID:wnAOqKt0
>>197
そうなるかも・・・加えて言えば、(Not fnd Is Nothing) と (fnd.Address <> fad)の
条件部分もVBだと両立しないのでNothingの判定はいらないかも
※fnd変数のNothing 判定を並列のIF条件に書くと fndがNothing の時にたぶん実行時エラーが出る

ループの条件はたぶん以下のように省略できる
Do
 〜(ループ処理)
 Set fnd = Sheet2.Columns(14).FindNext(fnd)
Loop While (fnd.Address <> fad)
0199デフォルトの名無しさん2016/05/10(火) 04:06:59.93ID:IdRScl5y
>>198
ありがとうございます。
Sheet2の14列目に同じ番号が複数あり、番号だけで比較すると、
古い行がヒットしてしまうので、12列目に日付も書いてあり、
最新の状態の行を確認して、その結果を反映させたかったのですが、
アドレスの不一致だけで大丈夫なのでしょうか?
0200デフォルトの名無しさん2016/05/10(火) 04:43:26.31ID:pT7b4QGj
試してみれば?
0201デフォルトの名無しさん2016/05/10(火) 04:46:33.24ID:IdRScl5y
>>200
試してはいるのですが、少し行数も多く確認に時間がかかってしまっています。
すみません。
0202デフォルトの名無しさん2016/05/10(火) 05:27:34.40ID:IdRScl5y
>>198
すみません。うかがいたいのですが、
Set fnd = Sheet2.Columns(14).FindNext(fnd)
Loop While (fnd.Address <> fad)

の場合、アドレスが一致するまでループを繰り返す、
一致したらループを出る、という事だと思うのですが、
例えば、同じ番号の行が2行あったとして、
その2行目の方が新しい日付の行だとして、その行をこの後に続く
条件式に当てはめていきたいのです。
で、一致するまでという事は、最初の検索で1行、FindNextで更に検索で
日付の新しい番号の一致するもう1行、でまた検索で
最初の1行でアドレスが一致してループが抜ける・・・合計3回検索することになると思うのですが、
最終的にループを出る時は、最初の行で抜けてしまう気がするのですが、
その解釈は間違ってますでしょうか?
0203デフォルトの名無しさん2016/05/10(火) 06:06:50.39ID:wnAOqKt0
>>202
fndの値は確かに最初の行に戻って抜けてしまうが、
FindNext直前のIf文の所で 変数 a2 に最新日付の行番号を取得しているようだし
Loopを抜けた後はそれを使えば欲しい行は持ってこれると思う

Sheet2.Rows(a2)
Sheet2.Cells(a2, [列番号])
0204デフォルトの名無しさん2016/05/10(火) 06:19:28.37ID:wnAOqKt0
Range.Find , FindNext は検索の終端を検知できずループしてしまうから
最初のアドレスと比較することでループを抜ける条件にしてるんじゃないかな
0205デフォルトの名無しさん2016/05/10(火) 06:21:27.00ID:IdRScl5y
>>202
本当にありがとうございます!
なるほど、確かにループは抜けてもa2にはその前の状態ですね!
やっと意味がある程度わかりましたw
0206デフォルトの名無しさん2016/05/10(火) 06:26:04.87ID:pT7b4QGj
試す場合は、一旦そのソースコードから離れて、
要点だけを抜き出した、短く新しいソースコードで試す

複雑なソースコードで、検証しない

なぜなら別の要因が混じってくるから、
そういうものを排除した環境で、テストする
0207デフォルトの名無しさん2016/05/10(火) 06:26:26.62ID:IdRScl5y
>>204
あ、なるほど。Findだけだと検索し続けてしまうのですね。
0208デフォルトの名無しさん2016/05/10(火) 06:28:47.47ID:IdRScl5y
>>206
了解しました。ありがとうございます。
0209デフォルトの名無しさん2016/05/13(金) 03:32:37.47ID:mSOPxExz
ExcelVBAで、ieの制御を行っているのですが、Linkをクリックしてページ移動したらその後、何も制御できません。
例えば、Aというサイトを開き、そのサイト内のリンクから、Bというサイトに移動します。そして、BというサイトのリンクからCというサイトに移動したいのに、Bというサイトに移動したまま何の制御もできません。
OSはwindows8.1
excelは2013
ieは11です。
0210デフォルトの名無しさん2016/05/13(金) 04:50:10.69ID:xGtILQbg
>>209
人間がマウス操作してリンクをクリックするの?

そもそもIE11では、ReadyStateの値がちゃんと変わらないので、ちょっと工夫しないとうまく制御できない
画面がチラチラしてもいいんなら、こうやれば読み込みの完了が旧バージョンと同じように判定できるようになるけど

objIE.Visible = False  ' 一度ブラウザを消して
objIE.Navigate sURL  ' 指定のURLにジャンプしてから
objIE.Visible = True  ' もう一度表示する
0211デフォルトの名無しさん2016/05/13(金) 07:45:26.02ID:bIkr/ix1
>>209
どんなコードになってるのか、何でIEを操作してるのか、俺たちにはわからない
0212デフォルトの名無しさん2016/05/13(金) 18:46:19.38ID:1DtqwGMj
FindNextをFindに置き換えて検索って可能なんでしょうか?
0213デフォルトの名無しさん2016/05/13(金) 19:05:27.31ID:4KmN92Wm
可能です
0214デフォルトの名無しさん2016/05/13(金) 19:05:40.89ID:1DtqwGMj
Find(検索対象,After:=検索したいもの,SearchDirection:=xlNext)
としたらFindNextと同意なのでしょうか?
0215デフォルトの名無しさん2016/05/13(金) 19:07:09.71ID:1DtqwGMj
>>213
ありがとうございます。
返信がかぶってしまったのですが、上記と同意なのでしょうか?
0216デフォルトの名無しさん2016/05/13(金) 19:39:21.98ID:quiTtpKe
得られる結果が同じだったとしても、処理が異なるから同意ではないじゃない?
02172092016/05/13(金) 19:41:39.39ID:mSOPxExz
すみません。以下ソースです。
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.navigate "http://hogehoge.jp";
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Sleep 1
If Now > timeOut Then
objIE.Refresh
timeOut = Now + TimeSerial(0, 0, 20)
End If
Loop
timeOut = Now + TimeSerial(0, 0, 20)
Do While objIE.document.readyState <> "complete"
DoEvents
Sleep 1
If Now > timeOut Then
objIE.Refresh
timeOut = Now + TimeSerial(0, 0, 20)
End If
Loop
Sleep 10000
For Each objtag In objIE.document.getElementsByTagName("a")
If InStr(objtag.outerHTML, "○○") > 0 Then
objtag.Click
Exit For
End If
Next
同ページ内の○○というリンクをクリックしてそのページに移動します。そして、移動したページから次のページに移動させるにもieの制御ができないのです。
上記の objtag.ClickやobjIE.document.Links(1).Clickを使っても無反応です。
0218デフォルトの名無しさん2016/05/13(金) 19:42:21.35ID:1DtqwGMj
>>216
申し訳ないです。処理が異なるというのは、
Find(検索対象,After:=検索したいもの,SearchDirection:=xlNext)
では、FindNextのように下まで検索した後、最初の一致セルに戻ってこない
という事でしょうか?
02192092016/05/13(金) 19:44:35.73ID:mSOPxExz
>>210
任意のキーワードを入力して、自動でクリックさせています。

>>211
言葉足らずですみません。
ExcelVBAでサイト内のaタグを自動でクリックするマクロを作っています。
0220デフォルトの名無しさん2016/05/13(金) 21:32:30.68ID:4amCJiHY
>>218
どっちが使いやすいか自分で判断するといい

Sub macro()
  Dim srcRng As Range, fnd As Range
  Dim firstAddr As String
  Set srcRng = ActiveSheet.UsedRange
  Debug.Print "■Findのみ"
  Set fnd = srcRng.Find("test", LookAt:=xlWhole, SearchDirection:=xlNext)
  If Not (fnd Is Nothing) Then
    firstAddr = fnd.Address
    Do
      Debug.Print fnd.Address
      Set fnd = srcRng.Find("test", After:=fnd, LookAt:=xlWhole, SearchDirection:=xlNext)
      If (fnd Is Nothing) Then Exit Do
    Loop While (fnd.Address <> firstAddr)
  End If
  Debug.Print "■FindNextあり"
  Set fnd = srcRng.Find("test", LookAt:=xlWhole, SearchDirection:=xlNext)
  If Not (fnd Is Nothing) Then
    firstAddr = fnd.Address
    Do
      Debug.Print fnd.Address
      Set fnd = srcRng.FindNext(After:=fnd)
      If (fnd Is Nothing) Then Exit Do
    Loop While (fnd.Address <> firstAddr)
  End If
End Sub
0221デフォルトの名無しさん2016/05/13(金) 21:52:33.49ID:1DtqwGMj
>>220
上の
Set fnd = srcRng.Find("test", LookAt:=xlWhole, SearchDirection:=xlNext)
のところで、実行時エラー91 オブジェクト変数または With ブロック変数
が設定されていません。 とでてしまいます。
0222デフォルトの名無しさん2016/05/13(金) 21:57:00.89ID:1DtqwGMj
>>220
申し訳ありません。文字の打ち間違いでした。
0223デフォルトの名無しさん2016/05/13(金) 22:05:27.55ID:1DtqwGMj
>>220
何個かのセルにtestといれて試してみたのですが、違いがよくわかりませんでした。
0224デフォルトの名無しさん2016/05/13(金) 22:21:28.96ID:KRWocFnH
>>223
書き方が違う
動きは同じ
0225デフォルトの名無しさん2016/05/13(金) 22:22:28.17ID:KRWocFnH
目的を達成する正解は一つじゃないってことだな
0226デフォルトの名無しさん2016/05/13(金) 22:24:18.61ID:1DtqwGMj
>>223
動きが同じなら
FindNextの方が文が短くてすむ・・・くらいの認識でよいという事ですね?
0227デフォルトの名無しさん2016/05/13(金) 22:28:41.38ID:1DtqwGMj
>>225
なるほど。ありがとうございます。
どちらの方法でも目的が達成できれば書きやすい方でという事ですね。

どちらも、testをアドレスが一致するまで検索するループという認識で
よいんですよね?
0228デフォルトの名無しさん2016/05/14(土) 00:02:13.05ID:KpaRNRq2
別でもう1点伺いたいのですが、

With Sheet3.Range("A1").CurrentRegion
.AdvancedFilter xlFilterInPlace,Sheet2.Range("A1").CurrentRegion
.SpecialCells(xlCellTypeVisible).Clear
End With

という文で、Sheet3の空白で囲まれている表の範囲と
Sheet2の空白で囲まれている表の範囲が比較出来、
Sheet3の不一致の部分だけが残るというのはわかるのですが、
何故比較できているのかが理解できません。
わかる方がいたら教えて下さい。
0229デフォルトの名無しさん2016/05/14(土) 01:59:54.31ID:KpaRNRq2
フィルタオプションでマクロを記録し見てみたのですが、
どう比較しているのかがやはりわかりませんでした。
どなたかご存知でしょうか?
0230デフォルトの名無しさん2016/05/14(土) 02:00:00.21ID:TfiX7v5Q
>>228
Excelのフィルタ機能があるのは知ってると思うけど
列毎に表示する基準を設定できるだろ

その設定をシート2に記述してるだけ

でspecialcellsでclearしてるから消える
clearをinterior.color=rgb(255,255,0)とか変えてみたら?
0231デフォルトの名無しさん2016/05/14(土) 02:19:13.82ID:KpaRNRq2
>>230
Sheet3とSheet2の行(レコード)同士を比較しているとは思うのですが、
Sheet3とSheet2で同じ行はあっても、何行目とか位置が違ったりしているのに、
どういう流れで比較をした結果が可視セルとしてみなされているのだろうと
思ってしまいました。
色は変えてみて、可視セルだけだけが色を塗られました。
0232デフォルトの名無しさん2016/05/14(土) 02:27:15.10ID:TfiX7v5Q
>>231
比較というより
フィルタ機能で列毎に表示または非表示にする条件を
シートにまとめて書いてるだけだって

試しにシート2で1列だけ残して他の列を全部消して動かしてみたら?
0233デフォルトの名無しさん2016/05/14(土) 02:36:02.98ID:TfiX7v5Q
Sheet4を追加して、下のように変えて実行してみたらわかるかも

With Sheet3.Range(
0234デフォルトの名無しさん2016/05/14(土) 02:37:26.14ID:TfiX7v5Q
Sheet4を追加して、下のように変えて実行してみたらわかるかも

With Sheet3.Range("A1").CurrentRegion
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheet2.Range("A1").CurrentRegion, copytorange:=Sheet4.Range("A1")
End With

xlFilterInPlace→xlFilterCopy に変えて
コピー先をSheet4.Range("A1")に指定

Sheet3の表に、Sheet2のフィルタ条件で、フィルタした結果をSheet4にコピーする
0235デフォルトの名無しさん2016/05/14(土) 02:40:15.99ID:KpaRNRq2
>>232
Sheet3にしか存在しない行だけ色無しになりました。
0236デフォルトの名無しさん2016/05/14(土) 02:42:52.92ID:TfiX7v5Q
フィルタが掛かっている状態かもしれないから
フィルタをクリアしてから実行した方が良い
0237デフォルトの名無しさん2016/05/14(土) 02:49:28.56ID:TfiX7v5Q
シート2の1行目はシート3の列名と等しくなっているはず
シート2の列名の下にフィルタ条件が書かれる
コードを実行すると
シート3の表にフィルタが掛けられる
その条件はシート2に書いた列でその下の値を持つ行だけが表示される

.SpecialCells(xlCellTypeVisible).Clear
をしているから、フィルタを掛けた後表示されているセルはクリアされる

その後、showallしてるからフィルタがクリアされる

結果として、フィルタ条件に合わなかった行が残る
0238デフォルトの名無しさん2016/05/14(土) 02:50:25.32ID:NImZCMbB
表示 > マクロ > マクロの表示
で開いているブックのsubが一覧表示されますが、
ここにaddinしているxlaの関数を表示させることはできないでしょうか。

fileName.xla!subName形式で直接入力すれば起動できることは知っています。
0239デフォルトの名無しさん2016/05/14(土) 02:50:51.66ID:KpaRNRq2
>>234
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheet2.Range("A1").CurrentRegion, copytorange:=Sheet4.Range("A1")

で型が一致しませんとでます。
0240デフォルトの名無しさん2016/05/14(土) 03:04:50.16ID:KpaRNRq2
>>237
フィルターはかかってなかったのでそのまま実行できました。
入力間違いがありました。失礼しました。
0241デフォルトの名無しさん2016/05/14(土) 03:12:37.15ID:TfiX7v5Q
>>235
元のコードで
clearしてるコードをコメントアウトして実行すると
フィルタした後に、showalldataするから何も変化しないはず

今度は、showalldataをコメントアウトしたらフィルタが掛かった状態のままになるはず
0242デフォルトの名無しさん2016/05/14(土) 03:15:34.80ID:KpaRNRq2
>>237
なんとなくわかった気がします。
Sheet2の見出しより下が検索条件になり、
Sheet3の中のSheet2にある行だけがSheet4にコピーされました。
それが可視セルになりSheet3の中のそれを消せば、Sheet2に無い行が残るわけですね。
0243デフォルトの名無しさん2016/05/14(土) 03:21:50.26ID:TfiX7v5Q
>>238
public sub xlacall()
call fileName.xla!subName
end sub
みたいなのを作るとか
0244デフォルトの名無しさん2016/05/14(土) 03:32:07.92ID:KpaRNRq2
>>241
.ShowAllDataをコメントアウトして実行してから、またコメントアウトをとったら、
実行時エラー 1004 ShowAllDataメソッドは失敗しました。Worksheetオブジェクト
と出るようになてしまいました。
0245デフォルトの名無しさん2016/05/14(土) 07:39:07.00ID:hiszDsJf
>>217
エスパー回答してみると

イントラとインターネットゾーン等でのIE8以降機能の整合性レベルが切り替えにたいする考慮をしていない
 対策:Set objIE = CreateObject("InternetExplorer.Application")を
     Set objIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")にする。
0246デフォルトの名無しさん2016/05/14(土) 10:13:09.39ID:NImZCMbB
>>243
せっかくいろんなファイルで利用できるようにライブラリ化したのに、
毎回それつくるっていうのが面倒で質問に来ました。
xla化せずに必要な関数をすべて入れたブックを毎回開けばよくはあるのですが、
xlaってこんなに不便なものか?何かやりようがあるんじゃないか?と思って
調べたもののまったく見つからずにいます。
0247デフォルトの名無しさん2016/05/14(土) 10:17:33.94ID:TfiX7v5Q
>>246
xlaの方でアドイン先のブックにxlaのプロシージャを呼び出すボタンとかを作る様にすれば良いのでは?

ブックにアドインしたら、そのブックにボタンが作成される感じ
0248デフォルトの名無しさん2016/05/14(土) 10:57:07.14ID:psfsGv+B
>>246
VBE窓からだったら
ツール (T) > マクロ (M) > マクロの場所(A) で アドインを選べばいいんだけどね
シートからだとわからん
0249デフォルトの名無しさん2016/05/14(土) 12:37:14.30ID:GIbFGwdT
>>246
俺はアドインに関数を呼び出すフォームのリボンを作ってる
02502462016/05/15(日) 00:45:01.97ID:YpwUXGuD
みなさんありがとうございます。

>>249
こういう方法があったんですね。
調べてみましたが、これで希望通りの挙動にできそうです。
ありがとうございました。
0251デフォルトの名無しさん2016/05/15(日) 14:26:01.12ID:WcH5yz8P
特定のセルに
2016/05/15
という年月日が入っています。
このセルを含むシートをVBAを使ってCSVに吐き出すと
#2016-05-15#
この様に表示されてしまうのですが、
そのまま年月日で吐き出されるようにコントロールできませんでしょうか。
0252デフォルトの名無しさん2016/05/15(日) 15:19:13.14ID:CrVPkhRD
>>251
何を使ってCSV出力しているか知らないから
Write ステートメントを使用していると仮定して・・・
日付型 (Date) のデータは、共通日付形式を使用して
書き込まれるので日付型を文字列にする必要がある

セル表示形式のテキストをそのまま出力したいなら
Range.ValueではなくRange.Textプロパティを使う

FileNumber = FreeFile
Open "d:\test.csv" For Output As #FileNumber
Write #FileNumber, Cells(1, 1).Text
Close #FileNumber
0253デフォルトの名無しさん2016/05/15(日) 15:19:48.19ID:ghf3z0AO
そりあえずそのコードを貼ってよ
■ このスレッドは過去ログ倉庫に格納されています