トップページ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/
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
そりあえずそのコードを貼ってよ
0254デフォルトの名無しさん2016/05/15(日) 15:38:07.34ID:WcH5yz8P
>>252-253
ネットにあったコードをコピペをそのまま使って試してみました。
Cells(i, 3)が年月日で、上手く表示されません。

Sub writeCSVFile_Click()
  '変数宣言
  Dim filePath As String
  Dim i As Long
  Dim maxRow As Long
  Dim fileNo As Integer

  '初期値設定
  filePath = ActiveWorkbook.Path & "\data.csv"
  maxRow = Range("A1").End(xlDown).Row '最終行取得
  fileNo = FreeFile 'FreeFile関数で使用可能なファイル番号取得

  'ファイル開く
  Open filePath For Output As #fileNo

  '最終行までループ
  For i = 1 To maxRow
    '列の数は決め打ち
    Write #fileNo, Cells(i, 1), Cells(i, 2), Cells(i, 3)
  Next i

  'ファイル閉じる
  Close #fileNo
End Sub
0255デフォルトの名無しさん2016/05/15(日) 15:44:13.67ID:tUFMlsQK
>>254
出力じゃなくて表示なの?
意味がわからない
0256デフォルトの名無しさん2016/05/15(日) 15:47:23.68ID:WcH5yz8P
>>255
わかりにくくてすみません。
上記でExcelからCSVに書き出した時に # が入ってしまいます。
0257デフォルトの名無しさん2016/05/15(日) 15:53:44.82ID:6V2nRwSD
>>254
>>252で答えが出てる
0258デフォルトの名無しさん2016/05/15(日) 16:09:42.68ID:UAuTMPBr
ところがTextプロパティには致命的な弱点が
0259デフォルトの名無しさん2016/05/15(日) 16:13:29.08ID:WcH5yz8P
>>257
ありがとうございました。
Cells(i, 3).Text
該当箇所をこの様に書き換えただけで直りました!
0260デフォルトの名無しさん2016/05/15(日) 20:06:14.39ID:ghf3z0AO
Excelで機械のデータシート表を作っていましてカッコ付きに変換するマクロを書きましたが

数字だとマイナスに  ex. 123 -> -123
和暦だと西暦に
0261デフォルトの名無しさん2016/05/15(日) 20:10:37.37ID:ghf3z0AO
Excelで機械のデータシート表を作っていまして楽をするためにカッコ付きに変換するマクロを書きましたが
数字だとマイナスに  ex. 123 -> -123
和暦だと西暦に  ex.平成28年1月1日 -> (2016/01/01)
なってしまいます
文章文字列などならうまくいくのですがどのようにマクロを書いたらいいのでしょうか

Sub 括弧()
ActiveCell.Value = "(" & ActiveCell.Value & ")"
End Sub
0262デフォルトの名無しさん2016/05/15(日) 21:15:44.76ID:+ceGV5qA
>>261
Sub 括弧()
With ActiveCell
  txt = .Text  '書式変更前の表示テキスト確保(通貨など)
  If IsNumeric(.Value) Then
    .NumberFormat = "@"
  End If
  .Value = "(" & txt & ")"
End With
End Sub
0263デフォルトの名無しさん2016/05/15(日) 21:26:13.47ID:ghf3z0AO
>>262
めっちゃスマートに書いてくださってありがとうございます
日付の場合数字の場合など複雑に考えて手をこまねいていました
0264デフォルトの名無しさん2016/05/15(日) 21:33:39.41ID:iEYIRe/o
すいませんエスパーの方お願いします。

ボタンをクリックしたらあるセルをハイパーリンクにしたいのですが
Cells(2, "B") = "=HYPERLINK('test')"

これだけで400エラーが出ます。なぜなのでしょうか
0265デフォルトの名無しさん2016/05/15(日) 21:39:01.79ID:U6OCYZVH
B2セルに直接 =HYPERLINK('test') と入力してもエラーになりませんか
0266デフォルトの名無しさん2016/05/15(日) 22:09:37.23ID:iEYIRe/o
>>265
ありがとうございますm(__)m
シングルクォーテーションがいけなかったんですね
ほんとは変数を付けてURL作ってたので他言語の癖でダブルとシングル両方使わないといけないと思ってました
0267デフォルトの名無しさん2016/05/17(火) 19:14:32.23ID:Ju7Z8cl/
If文が大量になってしまいまとめたいのですが、

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
Else
Sheet3.Cells(i,1)interior.ColorIndex = 3
End if
 if Sheet3.Cells(i,2) = Sheet2.Cells(fnd.Row,2) Then
Else
Sheet3.Cells(i,2)interior.ColorIndex = 3
End if
 if Sheet3.Cells(i,3) = Sheet2.Cells(fnd.Row,3) Then
Else
Sheet3.Cells(i,3)interior.ColorIndex = 3
End if

         ・

  if Sheet3.Cells(i,20) = Sheet2.Cells(fnd.Row,20) Then
Else
Sheet3.Cells(i,20)interior.ColorIndex = 3
End if
  Else
  Sheet3.Cells(i,2).EntireRow.Interior.ColorIndex = 4
End If
Next i
という風にしているのですが、もう少しまとめらないかと思いました。
まとめられるのでしょうか?
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
でいいのは何ででしょう?
■ このスレッドは過去ログ倉庫に格納されています