Excel VBA 質問スレ Part41©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
2016/04/27(水) 04:11:46.79ID:Nk+oP5xRコード書き込みや作成依頼も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:Uh7lvDUNexcel vba セル 番地 指定 でググる
0187デフォルトの名無しさん
2016/05/08(日) 17:49:35.23ID:B17gXYq2ActiveSheet.Hyperlinks.Add Anchor:=ActiveSheet.Range("B1"), Address:="", SubAddress:="Sheet2!A1"
0188デフォルトの名無しさん
2016/05/08(日) 18:50:05.07ID:LbMOyLBe>>186
ありがとうございます。
0189デフォルトの名無しさん
2016/05/08(日) 21:28:50.28ID:Mc3+72Z/隣り合ったふたつのセルを結合したいのですが、
1.セルA1とB1を結合
2.セルA2とB2を結合
3.以降、任意の行まで同じ作業を繰り返し
4.AB列で作業が終わったら次はCD列でも同じ作業
5.CD列が終了したらEF列に移動
6.以降、任意の列まで同じ作業を繰り返し
です。
その際結合させるふたつのセルにはそれぞれ値が入っていますが、活かすのは左のセルの値です。
結合の際の「右上のデータが〜」というメッセージは無視したいです。
どなたかお分かりの方がいらっしゃいましたらお願いします。
0190デフォルトの名無しさん
2016/05/08(日) 22:06:12.34ID:to9qHxlC0191デフォルトの名無しさん
2016/05/08(日) 22:14:16.85ID:to9qHxlCこんな感じ?
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/さっそくのご回答ありがとうございます。
今から試してみます。
0193デフォルトの名無しさん
2016/05/08(日) 23:07:29.52ID:Mc3+72Z/書いていただいたVBAをコピペして試しましたが、セルをひとつ結合しただけで終わってしまいました。
0194デフォルトの名無しさん
2016/05/08(日) 23:09:23.84ID:Mc3+72Z/ありがとうございます!
0195デフォルトの名無しさん
2016/05/10(火) 01:32:49.02ID:IdRScl5yなられるのであれば、意味を教えていただきたいのですが、
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:wnAOqKt0Not (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ありがとうございます。
Set fnd = Sheet2.Columns(14).FindNext(fnd)
で最初の検索から、更に同じ番号のセルがないかを検索して、
見つかった場合は、fnd内にその見つかった番号が入ると思うのですが、
そうなると、検索で番号が見つかっているので既に番号の一致はとれていて、
更にSheet2.Cells(a2,14).Valueとnumの番号の一致をとっているのは、
2重で一致をとっていることになるのでしょうか?
文章が下手ですみません。
0198デフォルトの名無しさん
2016/05/10(火) 03:51:15.80ID:wnAOqKt0そうなるかも・・・加えて言えば、(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ありがとうございます。
Sheet2の14列目に同じ番号が複数あり、番号だけで比較すると、
古い行がヒットしてしまうので、12列目に日付も書いてあり、
最新の状態の行を確認して、その結果を反映させたかったのですが、
アドレスの不一致だけで大丈夫なのでしょうか?
0200デフォルトの名無しさん
2016/05/10(火) 04:43:26.31ID:pT7b4QGj0201デフォルトの名無しさん
2016/05/10(火) 04:46:33.24ID:IdRScl5y試してはいるのですが、少し行数も多く確認に時間がかかってしまっています。
すみません。
0202デフォルトの名無しさん
2016/05/10(火) 05:27:34.40ID:IdRScl5yすみません。うかがいたいのですが、
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:wnAOqKt0fndの値は確かに最初の行に戻って抜けてしまうが、
FindNext直前のIf文の所で 変数 a2 に最新日付の行番号を取得しているようだし
Loopを抜けた後はそれを使えば欲しい行は持ってこれると思う
Sheet2.Rows(a2)
Sheet2.Cells(a2, [列番号])
0204デフォルトの名無しさん
2016/05/10(火) 06:19:28.37ID:wnAOqKt0最初のアドレスと比較することでループを抜ける条件にしてるんじゃないかな
0205デフォルトの名無しさん
2016/05/10(火) 06:21:27.00ID:IdRScl5y本当にありがとうございます!
なるほど、確かにループは抜けてもa2にはその前の状態ですね!
やっと意味がある程度わかりましたw
0206デフォルトの名無しさん
2016/05/10(火) 06:26:04.87ID:pT7b4QGj要点だけを抜き出した、短く新しいソースコードで試す
複雑なソースコードで、検証しない
なぜなら別の要因が混じってくるから、
そういうものを排除した環境で、テストする
0207デフォルトの名無しさん
2016/05/10(火) 06:26:26.62ID:IdRScl5yあ、なるほど。Findだけだと検索し続けてしまうのですね。
0208デフォルトの名無しさん
2016/05/10(火) 06:28:47.47ID:IdRScl5y了解しました。ありがとうございます。
0209デフォルトの名無しさん
2016/05/13(金) 03:32:37.47ID:mSOPxExz例えば、Aというサイトを開き、そのサイト内のリンクから、Bというサイトに移動します。そして、BというサイトのリンクからCというサイトに移動したいのに、Bというサイトに移動したまま何の制御もできません。
OSはwindows8.1
excelは2013
ieは11です。
0210デフォルトの名無しさん
2016/05/13(金) 04:50:10.69ID:xGtILQbg人間がマウス操作してリンクをクリックするの?
そもそもIE11では、ReadyStateの値がちゃんと変わらないので、ちょっと工夫しないとうまく制御できない
画面がチラチラしてもいいんなら、こうやれば読み込みの完了が旧バージョンと同じように判定できるようになるけど
objIE.Visible = False ' 一度ブラウザを消して
objIE.Navigate sURL ' 指定のURLにジャンプしてから
objIE.Visible = True ' もう一度表示する
0211デフォルトの名無しさん
2016/05/13(金) 07:45:26.02ID:bIkr/ix1どんなコードになってるのか、何でIEを操作してるのか、俺たちにはわからない
0212デフォルトの名無しさん
2016/05/13(金) 18:46:19.38ID:1DtqwGMj0213デフォルトの名無しさん
2016/05/13(金) 19:05:27.31ID:4KmN92Wm0214デフォルトの名無しさん
2016/05/13(金) 19:05:40.89ID:1DtqwGMjとしたらFindNextと同意なのでしょうか?
0215デフォルトの名無しさん
2016/05/13(金) 19:07:09.71ID:1DtqwGMjありがとうございます。
返信がかぶってしまったのですが、上記と同意なのでしょうか?
0216デフォルトの名無しさん
2016/05/13(金) 19:39:21.98ID:quiTtpKe0217209
2016/05/13(金) 19:41:39.39ID:mSOPxExzDim 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申し訳ないです。処理が異なるというのは、
Find(検索対象,After:=検索したいもの,SearchDirection:=xlNext)
では、FindNextのように下まで検索した後、最初の一致セルに戻ってこない
という事でしょうか?
0219209
2016/05/13(金) 19:44:35.73ID:mSOPxExz任意のキーワードを入力して、自動でクリックさせています。
>>211様
言葉足らずですみません。
ExcelVBAでサイト内のaタグを自動でクリックするマクロを作っています。
0220デフォルトの名無しさん
2016/05/13(金) 21:32:30.68ID:4amCJiHYどっちが使いやすいか自分で判断するといい
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上の
Set fnd = srcRng.Find("test", LookAt:=xlWhole, SearchDirection:=xlNext)
のところで、実行時エラー91 オブジェクト変数または With ブロック変数
が設定されていません。 とでてしまいます。
0222デフォルトの名無しさん
2016/05/13(金) 21:57:00.89ID:1DtqwGMj申し訳ありません。文字の打ち間違いでした。
0223デフォルトの名無しさん
2016/05/13(金) 22:05:27.55ID:1DtqwGMj何個かのセルにtestといれて試してみたのですが、違いがよくわかりませんでした。
0224デフォルトの名無しさん
2016/05/13(金) 22:21:28.96ID:KRWocFnH書き方が違う
動きは同じ
0225デフォルトの名無しさん
2016/05/13(金) 22:22:28.17ID:KRWocFnH0226デフォルトの名無しさん
2016/05/13(金) 22:24:18.61ID:1DtqwGMj動きが同じなら
FindNextの方が文が短くてすむ・・・くらいの認識でよいという事ですね?
0227デフォルトの名無しさん
2016/05/13(金) 22:28:41.38ID:1DtqwGMjなるほど。ありがとうございます。
どちらの方法でも目的が達成できれば書きやすい方でという事ですね。
どちらも、testをアドレスが一致するまで検索するループという認識で
よいんですよね?
0228デフォルトの名無しさん
2016/05/14(土) 00:02:13.05ID:KpaRNRq2With 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:TfiX7v5QExcelのフィルタ機能があるのは知ってると思うけど
列毎に表示する基準を設定できるだろ
その設定をシート2に記述してるだけ
でspecialcellsでclearしてるから消える
clearをinterior.color=rgb(255,255,0)とか変えてみたら?
0231デフォルトの名無しさん
2016/05/14(土) 02:19:13.82ID:KpaRNRq2Sheet3とSheet2の行(レコード)同士を比較しているとは思うのですが、
Sheet3とSheet2で同じ行はあっても、何行目とか位置が違ったりしているのに、
どういう流れで比較をした結果が可視セルとしてみなされているのだろうと
思ってしまいました。
色は変えてみて、可視セルだけだけが色を塗られました。
0232デフォルトの名無しさん
2016/05/14(土) 02:27:15.10ID:TfiX7v5Q比較というより
フィルタ機能で列毎に表示または非表示にする条件を
シートにまとめて書いてるだけだって
試しにシート2で1列だけ残して他の列を全部消して動かしてみたら?
0233デフォルトの名無しさん
2016/05/14(土) 02:36:02.98ID:TfiX7v5QWith Sheet3.Range(
0234デフォルトの名無しさん
2016/05/14(土) 02:37:26.14ID:TfiX7v5QWith 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:KpaRNRq2Sheet3にしか存在しない行だけ色無しになりました。
0236デフォルトの名無しさん
2016/05/14(土) 02:42:52.92ID:TfiX7v5Qフィルタをクリアしてから実行した方が良い
0237デフォルトの名無しさん
2016/05/14(土) 02:49:28.56ID:TfiX7v5Qシート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.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheet2.Range("A1").CurrentRegion, copytorange:=Sheet4.Range("A1")
で型が一致しませんとでます。
0240デフォルトの名無しさん
2016/05/14(土) 03:04:50.16ID:KpaRNRq2フィルターはかかってなかったのでそのまま実行できました。
入力間違いがありました。失礼しました。
0241デフォルトの名無しさん
2016/05/14(土) 03:12:37.15ID:TfiX7v5Q元のコードで
clearしてるコードをコメントアウトして実行すると
フィルタした後に、showalldataするから何も変化しないはず
今度は、showalldataをコメントアウトしたらフィルタが掛かった状態のままになるはず
0242デフォルトの名無しさん
2016/05/14(土) 03:15:34.80ID:KpaRNRq2なんとなくわかった気がします。
Sheet2の見出しより下が検索条件になり、
Sheet3の中のSheet2にある行だけがSheet4にコピーされました。
それが可視セルになりSheet3の中のそれを消せば、Sheet2に無い行が残るわけですね。
0243デフォルトの名無しさん
2016/05/14(土) 03:21:50.26ID:TfiX7v5Qpublic sub xlacall()
call fileName.xla!subName
end sub
みたいなのを作るとか
0244デフォルトの名無しさん
2016/05/14(土) 03:32:07.92ID:KpaRNRq2.ShowAllDataをコメントアウトして実行してから、またコメントアウトをとったら、
実行時エラー 1004 ShowAllDataメソッドは失敗しました。Worksheetオブジェクト
と出るようになてしまいました。
0245デフォルトの名無しさん
2016/05/14(土) 07:39:07.00ID:hiszDsJfエスパー回答してみると
イントラとインターネットゾーン等でのIE8以降機能の整合性レベルが切り替えにたいする考慮をしていない
対策:Set objIE = CreateObject("InternetExplorer.Application")を
Set objIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")にする。
0246デフォルトの名無しさん
2016/05/14(土) 10:13:09.39ID:NImZCMbBせっかくいろんなファイルで利用できるようにライブラリ化したのに、
毎回それつくるっていうのが面倒で質問に来ました。
xla化せずに必要な関数をすべて入れたブックを毎回開けばよくはあるのですが、
xlaってこんなに不便なものか?何かやりようがあるんじゃないか?と思って
調べたもののまったく見つからずにいます。
0247デフォルトの名無しさん
2016/05/14(土) 10:17:33.94ID:TfiX7v5Qxlaの方でアドイン先のブックにxlaのプロシージャを呼び出すボタンとかを作る様にすれば良いのでは?
ブックにアドインしたら、そのブックにボタンが作成される感じ
0248デフォルトの名無しさん
2016/05/14(土) 10:57:07.14ID:psfsGv+BVBE窓からだったら
ツール (T) > マクロ (M) > マクロの場所(A) で アドインを選べばいいんだけどね
シートからだとわからん
0249デフォルトの名無しさん
2016/05/14(土) 12:37:14.30ID:GIbFGwdT俺はアドインに関数を呼び出すフォームのリボンを作ってる
0250246
2016/05/15(日) 00:45:01.97ID:YpwUXGuD>>249
こういう方法があったんですね。
調べてみましたが、これで希望通りの挙動にできそうです。
ありがとうございました。
0251デフォルトの名無しさん
2016/05/15(日) 14:26:01.12ID:WcH5yz8P2016/05/15
という年月日が入っています。
このセルを含むシートをVBAを使ってCSVに吐き出すと
#2016-05-15#
この様に表示されてしまうのですが、
そのまま年月日で吐き出されるようにコントロールできませんでしょうか。
0252デフォルトの名無しさん
2016/05/15(日) 15:19:13.14ID:CrVPkhRD何を使って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:ghf3z0AO0254デフォルトの名無しさん
2016/05/15(日) 15:38:07.34ID:WcH5yz8Pネットにあったコードをコピペをそのまま使って試してみました。
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出力じゃなくて表示なの?
意味がわからない
0256デフォルトの名無しさん
2016/05/15(日) 15:47:23.68ID:WcH5yz8Pわかりにくくてすみません。
上記でExcelからCSVに書き出した時に # が入ってしまいます。
0257デフォルトの名無しさん
2016/05/15(日) 15:53:44.82ID:6V2nRwSD>>252で答えが出てる
0258デフォルトの名無しさん
2016/05/15(日) 16:09:42.68ID:UAuTMPBr0259デフォルトの名無しさん
2016/05/15(日) 16:13:29.08ID:WcH5yz8Pありがとうございました。
Cells(i, 3).Text
該当箇所をこの様に書き換えただけで直りました!
0260デフォルトの名無しさん
2016/05/15(日) 20:06:14.39ID:ghf3z0AO数字だとマイナスに ex. 123 -> -123
和暦だと西暦に
0261デフォルトの名無しさん
2016/05/15(日) 20:10:37.37ID:ghf3z0AO数字だとマイナスに 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:+ceGV5qASub 括弧()
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めっちゃスマートに書いてくださってありがとうございます
日付の場合数字の場合など複雑に考えて手をこまねいていました
0264デフォルトの名無しさん
2016/05/15(日) 21:33:39.41ID:iEYIRe/oボタンをクリックしたらあるセルをハイパーリンクにしたいのですが
Cells(2, "B") = "=HYPERLINK('test')"
これだけで400エラーが出ます。なぜなのでしょうか
0265デフォルトの名無しさん
2016/05/15(日) 21:39:01.79ID:U6OCYZVH0266デフォルトの名無しさん
2016/05/15(日) 22:09:37.23ID:iEYIRe/oありがとうございますm(__)m
シングルクォーテーションがいけなかったんですね
ほんとは変数を付けてURL作ってたので他言語の癖でダブルとシングル両方使わないといけないと思ってました
0267デフォルトの名無しさん
2016/05/17(火) 19:14:32.23ID:Ju7Z8cl/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/Else
Sheet3.Cells(i,2)interior.ColorIndex = 3
End If
はいらなかったです。失礼しました。
0269デフォルトの名無しさん
2016/05/17(火) 20:15:20.61ID:YEbHD3bH0270デフォルトの名無しさん
2016/05/17(火) 20:24:22.15ID:Ju7Z8cl/switch文とはどのように使うのでしょうか?
今調べて見てるのですが・・・
0271デフォルトの名無しさん
2016/05/17(火) 20:33:31.31ID:uw1YLM9Dせめて 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/そうでした。申し訳ありません。
わざわざ=で、Elseを入れる意味はないですね。
その上で、このIf文をもう少しまとめる方法はないでしょうか?
0273デフォルトの名無しさん
2016/05/17(火) 21:09:16.27ID:Bh5kVr4XFor 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:kv5Z22Gcswitch文は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/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/ありがとうございました。
それだけでよかったですね。
0277デフォルトの名無しさん
2016/05/19(木) 15:21:44.50ID:hJ/G9SOxその値が入っているセルの位置情報が記憶され、そこから検索がかかるという認識で
よいのでしょうか?
0278デフォルトの名無しさん
2016/05/19(木) 16:33:50.64ID:oZsWPLv6https://msdn.microsoft.com/ja-jp/library/office/ff839746.aspx
google とかでexcel vba find とか検索すれば出てくる
0279デフォルトの名無しさん
2016/05/20(金) 17:13:57.06ID:P6F1ZDVPID変わりましたが、返信遅くなりました。
そこは見ているのですが、何故変数にはセルの値が入っているのに、セルの場所を指定した事になるのかと思いまして、質問させていただきました。
0280デフォルトの名無しさん
2016/05/20(金) 18:50:53.92ID:gsWAgsomFindの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? "a"&10
a 8
? "a"&100
a 64
? "a"&1000
a 512
後はわかるな?
0283デフォルトの名無しさん
2016/05/20(金) 22:14:31.20ID:d/ZNR8o9すいません、さっぱりわかりません。
? 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?"a"&1 を
?"a" & 1 のように
&の前後に空白を入れてやれば"a1"と出力される
試しにコード上で
Debug.Print "a"&1 と&の前後に空白なしで記述すると
Debug.Print "a"; &O1 に自動変換されるので
おそらく文字型と数値型の2つの型のデータが出力されている
数値型データの場合、先頭に空白が入る模様
0285デフォルトの名無しさん
2016/05/20(金) 22:33:41.48ID:d/ZNR8o9なるほど
&N01
&P01
ではだめで
&O01
でいいのは何ででしょう?
■ このスレッドは過去ログ倉庫に格納されています