1 名前:デフォルトの名無しさん [2017/11/08(水) 11:26:30.13 ID:+KUB1/9hd.net] スレ立ての際は一行目に !extend:checked:vvvvv:1000:512 と入れてスレ立てして下さい ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※関連スレ VBAなんでも質問スレ Part2 mevius.2ch.net/test/read.cgi/tech/1432173164/ Access VBA 質問スレ Part1 mevius.2ch.net/test/read.cgi/tech/1328536426/ Excel総合相談所 126 https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/ ※前スレ Excel VBA 質問スレ Part50 mevius.2ch.net/test/read.cgi/tech/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
862 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 10:31:44.20 ID:no6Ylxj0a.net] sqlならselectとorder byだけですむ案件だな 愚直にプログラム組むと厄介だけどね
863 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 10:38:07.48 ID:7zx5w2nrd.net] ピボットでいいんじゃね
864 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 11:56:10.93 ID:iFN99ve4d.net] LINQって使えないんだっけ?
865 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 13:22:48.32 ID:Gj6t78kg0.net] >>829 嘔吐フィルターかけてソートしてから 一致を
866 名前:上からみて加算と消去 フィルター解除忘れずに(多分ソート直後にすぐ) [] [ここ壊れてます]
867 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 13:42:37.28 ID:hO93+Igl0.net] >>829 ↑ 上級者じゃない俺なんかこういうのみると 全部2次元配列にぶちこんでif多用して無理矢理やっちゃうんだけど そういうのはだめなの?
868 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 13:47:48.60 ID:cJgHrV+ta.net] >>841 だめじゃないし、初心者なら無理やりVBAで組むのも勉強になるよ 重複の無いリスト作るのがやや面倒というか、煩雑になりがちなところだな エクセルの機能使えばいいっちゃいいけど、好みじゃないな
869 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 13:55:27.88 ID:hO93+Igl0.net] >>842 おれこういうの無理矢理やっちゃうの大好きで完成すると充実感半端ない 俺が組むマクロってそんなのばかりだ 基本初心者レベルの知識しか使わないでやっちゃうんで、 こういう質問をする人は、無理矢理やると遅くなるとか別の理由があって聞いてるのかな? とか思っちゃう
870 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 15:19:59.75 ID:kPmYITG+0.net] ファーム1の中に、オプションボタンが18個あり、オブジェクト名を『OP_1』〜『OP_18』としてボタン1を押してフォーム2に切り替える時に選択されてるオプションボタンのキャプションを取得して変数TUR1に入れたいんですけどどうしたらいいですか?
871 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 16:20:08.23 ID:pGh8JphK0.net] >>844 For i = 1 To 18 With Me.Controls("OP_" & CStr(i)) If .Value = True Then TUR1 = .Caption Exit For End If End With Next
872 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 17:41:48.62 ID:uhyB+DSmd.net] 初心者なんだけど以下のような表から特定のセルに入力された場合だけ、特定のセルをカウントする方法ってありますか? Aは全て Bは選ばれたものだけ、みたいな Aの全てをカウントするのはわけないんだけど、Bの選ばれたものだけをカウントする方法がわからない IF使うにしても何を指定すればいいのでしょう? わかりにくかてすいません o.8ch.net/11r7r.png
873 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 17:54:54.38 ID:IwnGnNnba.net] >>843 普通にやり方がわからないんじゃないの >>846 cがキーになるなら重複しないcの一覧をつくって二次元配列でも構造体でもいいけどbがtrueならカウントするっていう風にすればいいと思う 件数多いならDBの領分だと思うけどね、この手の集計は
874 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:02:17.19 ID:HiTEnEcXd.net] >>845 ありがとうございます!
875 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:13:43.61 ID:uhyB+DSmd.net] >>847 Bがtrueなら、というのはどうやって指定すればいいですか? 範囲指定で
876 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:23:20.07 ID:uhyB+DSmd.net] すいません、間違えて書き込んでしまいました >>847 Bがtrueなら、というのはどうやって指定すればいいですか? 範囲指定でがっつりやると、指定した範囲に一つでもtrueがあるとカウントしてしまって結局全部をカウントしてしまうんです
877 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:27:59.94 ID:iMxAIJokM.net] >>829 何も難しく考えなくても、E列に=A&B&Cを入れて、E列を行ラベルにしてピボットテーブルで集計するだけで出来るよ。 ABC列をもどしたいならINDEX,MATCHで引っ張って来ないといけないけども、日々エクセル使ってる人なら手慣れたものだと思う。と言うか慣れておくと色々便利。 詳しい解説いるならする
878 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:58:58.92 ID:IwnGnNnba.net] >>850 一行ずつループしてるんだよね? フラグ用に変数用意してるなら一ループごとに初期化し直さないとだめよ ってか、今どんなコードで動かしてるか書いてくれるとやり易いんだけど
879 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 02:37:52.28 ID:Uixpo
] [ここ壊れてます]
880 名前:pG00.net mailto: フィルタとCOUNTIFで良い気がするが どうしてもVBAでやりたいのか? [] [ここ壊れてます]
881 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 17:45:28.92 ID:Kfn/8I4m0.net] HTMLソースで <a href = URL1</a> <br />**** ← 4桁の特定の数字が入る <a href = URL2>予約中</a> <a href = URL3>[取消]</a><br /><a href = URL4>[訂正]</a> 上記の4桁の数字とURL以外同様のソースが全部で10個あるページがあり、C5セルに4桁の数字を入れ、それに対応したURL3のリンクをクリックしたいのですが、どうすれば可能でしょうか? IEでそのページまで飛ぶのは問題ないのですが、aタグのインナーテキストが4桁の数字以外共通なためForとGetElementsByTagNameとの組み合わせでクリックできないので何か手段があれば教えて頂きたいです。
882 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 21:06:25.46 ID:UyFZaUswa.net] >>829 そういう処理だったらソートしても問題無さそうだからソートしてループで良いんじゃね? >>854 4桁の数字以外共通だとどうしてForとGetElementsByTagnameとの組み合わせでクリック出来ないのかが分からん。
883 名前:851 mailto:sage [2018/01/05(金) 21:25:01.57 ID:Kfn/8I4m0.net] >>855 あ、確かに。書き間違えました。下記のコードだと10個のリンクのうち、一番上にあるやつをクリックすると思うのですが、 C5セルに入力した特定の4桁の数字の下にあるリンクをクリックしたいのです。 For Each obj In objIE.Document.getElementsByTagName("a") If InStr(obj.innertext, "取消") > 0 Then obj.Click Exit For End If Next
884 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 22:16:41.06 ID:vO88ak3C0.net] DOMに親要素とか隣の要素を見ていくのあったよね あれで必要なだけ移動させればいいんじゃね
885 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 22:20:08.87 ID:vO88ak3C0.net] >>829 を >>836 の方法で頑張ってコードにしたのを書き込みたいんだけど 403になっちゃうのよね 禁断のコードが含まれているのかしら
886 名前:デフォルトの名無しさん [2018/01/07(日) 08:20:46.08 .net] >>846 VBAを使わずにExcelの計算式で書くとこうだよね。 ・C列が「10」、B列が「○」の行を数えるなら =COUNTIFS($C$2:$C$6,10,$B$2:$B$6,"○") ・C列が「10」、B列が空以外の行を数えるなら =COUNTIF($C$2:$C$6,10)-COUNTIFS($A$2:$A$6,10,$B$2:$B$6,"") これをVBAで書きたいなら、そのままワークシート関数を呼び出せばいい。 ・C列が「10」、B列が「○」の行を数えるなら With Worksheets("Sheet1") dblCnt = WorksheetFunction.CountIfs(.Range("C2:C6"), 10, .Range("B2:B6"), "○") End With ・C列が「10」、B列が空以外の行を数えるなら With Worksheets("Sheet1") dblCnt = WorksheetFunction.CountIf(.Range("C2:C6"), 10) - WorksheetFunction.CountIfs(.Range("C2:C6"), 10, .Range("B2:B6"), "") End With 注:COUNTIFS関数はOffice 2007で追加されたので、2003とかでも動くようにするには 計算式なら配列数式を使うかダミーの結合列 (例: F列に =B2&”:”&C2)を使う必要があるし、 VBAなら自前で1行ずつループするFor文を書く必要がある。
887 名前:デフォルトの名無しさん mailto:sage [2018/01/08(月) 01:12:41.23 ID:bgHHDE53D] >>856 すごい お馬鹿な返信で申し訳ないけど イメージとしてまず、 <a href = URL1</a> <br />**** ← 4桁の特定の数字が入る <a href = URL2>予約中</a> <a href = URL3>[取消]</a><br /><a href = URL4>[訂正]</a> の部分がページ内で繰り返して複数あるなら、この部分だけを取り出す処理を繰り返して splitなりで個数を数えて 処理するとか。(取り出す位置は、InStrで取って、終わり位置を 次の開始位置にして) その上で、この部分にC5と同じ値があるならクリックするとか。 C5の値を変数aにして、InStr(取り出した部分, a) > 0で良いような。 すいません。曖昧な返信で。
888 名前:sage [2018/01/11(木) 23:28:08.34 ID:kwmxLljDv] 教えていただきたいです。 あるセルの数字に関して o以下と12以上はA 6以上12未満はB それ以外はなしという式を作るとしたら =if(or(セル<0,セル>=12),"A",if(6<セル=<12,"B"," ")) という式ではちゃんと返ってきません。 正しい式をご教授願います。
889 名前:デフォルトの名無しさん mailto:sage [2018/01/11(木) 12:40:04.91 ID:eKl5cJvJd.net] コンボboxを使ってサジェスト機能みたいなことをしたくて作ってみたんだけど、1文字目はうまくいくんだけど2文字目以降打つとリストの一番上が乗ってきて使い心地が良くないんだけど、どうしたらいいですか? コンボboxのリストのみをクリアするやり方もいまいちわかりません。 j=2 Tname.rist=array() set MstSht=worksheets(″マスター″) str_word=controls(″Tname″&j).value for i=2toMstSht.cells(rows.count,6).end(xlup).row if instr(ucase(MstSht.cells(i,6).value),ucase(str_word))=1 then controls(″Tname″&j).additem MstSht.cells(i,6).value end if next
890 名前:デフォルトの名無しさん mailto:sage [2018/01/11(木) 19:23:41.06 ID:WJjCr32Q0.net] エクセルの2003ですが、 並べて比較を使用した際にペアになっているブックと、 そのブックで表示されているシートを取得するには どのように記述すればいいでしょうか。
891 名前:デフォルトの名無しさん [2018/01/11(木) 21:16:23.66 ID:JbTpKTF6M.net] >>863 何を言っているのでしょうか?
892 名前:デフォルトの名無しさん [2018/01/11(木) 21:25:37.65 ID:a2sLbYI50.net] 世界教師マイトLーヤ「大暴落は日本からスタート」 rio2016.5ch.net/test/read.cgi/2chse/1512813686/l50 【マイトLーヤ】 米国債を売れ 【1200兆円】 https://medaka.5ch.net/test/read.cgi/eco/1515587891/l50
893 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 01:30:55.27 ID:GWvM9lig0.net] >>863 Excel2003はサポート切れてますので Excel2007にのりかえましょう
894 名前:デフォルトの名無しさん [2018/01/12(金) 01:41:04.62 .net] >>866 Excel2007なら>>863 できるん?(´・ω・`)
895 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 15:56:41.55 ID:kdQVxAch0.net] 0回目って何?
896 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 19:59:42.26 ID:8L8z7qJh0.net] vbModelessで開いたUserForm上のTextBoxにSetFocusするようInitializeに記述しても効きません これって無理なんですかね? vbModelessを切るとフォーカスがちゃんとTextBoxに移るんですけどね
897 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 23:20:03.95 ID:Ln5WwMFr0.net] 初期状態でフォーカスを当てたいなら UserForm.Show vbModeless UserForm.TextBox.SetFocus とフォームを呼んでいるプロシージャ側に書く フォームのイベントならActivateでどうでしょう 毎回フォームがアクティブになるたびフォーカスしちゃうけど Initializeがなぜはしらないのかは知らない
898 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 23:44:10.99 ID:Ln5WwMFr0.net] 実験してみたらInitializeは呼ばれてるけど SetFocusだけがだめみたい 他のことは普通にできる なんでしょうね
899 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 23:46:18.93 ID:WKndAwKhM.net] いやExsel 2007もサポート切れてますが
900 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 03:26:50.74 ID:0Hr8k8ED0.net] >>871 自分でもいろいろやってみたんですけどやっぱりダメみたいですね ありがとうございました
901 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 09:26:06.50 ID:60QkmGs40.net] 試してないけど、プロパティのTabIndexも駄目だったの?
902 名前:デフォルトの名無しさん [2018/01/13(土) 10:05:22.76 ID:8yN0Kzpj0.net] ThisWorkbook.Application.Hwndでブックのハンドルを取得して、 SetLayeredWindowAttributesで透過処理をする時、 LWA_ALPHAでは問題ないのに、 LWA_COLORKEYに変えると、なぜかブック全体ではなく、 シート上に最初に配置したコマンドボタンの方に誤爆します。 しかも、自分のPCでは問題ないのに、他人のPCだと誤爆するという意味不明さ。 ハンドルがずれる的なバグでもあるのでしょうか?
903 名前:デフォルトの名無しさん [2018/01/13(土) 10:12:39.30 .net] ウィンドウ表示時にフォーカス当てたいんならTabIndex=0にすればいいんだと思うけど、 あとはフラグを使ってInitialize直後のActivateイベントでフォーカスを当てればいいんじゃね? Private mblnInitFlag As Boolean Private Sub UserForm_Activate() If mblnInitFlag Then TextBox2.SetFocus mblnInitFlag = False End If End Sub Private Sub UserForm_Initialize() mblnInitFlag = True End Sub
904 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 10:19:25.53 ID:WLDq+ue70.net] 一つ目の表 A,B,C,D,E aaa,bb,cc,00,20 bbb,cc,dd,11,30 二つ目の表 G,H,I,J,K aaa,bb,cc,00,10 bbb,cc,dd,11,10 上の様な表があり、一つ目のABC列と二つ目のGHI列の値が一致すれば、二つ目の表の横にE列からK列の数値を引いた値を表示したい。 一致するデータが無ければ、一致データ無しと表示。 上の表だと2つ目の表の右列に、それぞれ10,20と表示。 データ量は300~800程です。 出来る方、よろしくお願いします。
905 名前:デフォルトの名無しさん [2018/01/13(土) 10:29:13.82 .net] >>875 LWA_COLORKEYは指定した色を透明にするんだから、 その他人のPCでExcelのウィンドウの色が違うんじゃね? 知らんけど
906 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 10:31:29.99 ID:uYJANG/vd.net] 既存プログラムで引数が多いやつを減らしたいんだけどどうすればいい? ただグローバル変数使うと他のアプリケーションに影響出るから使えない。 今から構造化やクラスにするのは名前変更が大変そうだし、同じ型でも同じ動作でもないからまとめにくい。
907 名前:デフォルトの名無しさん [2018/01/13(土) 10:39:42.82 ID:8yN0Kzpj0.net] >>878 それが、コマンドボタンとシートの色を同じにしても、 コマンドボタンの方だけ透過されるんです。 しかも最初に配置したコマンドボタンだけ。 2個目以降は変わらず。 透過の前後で、ハンドルの値をデバッグプリントしても変化ないですし。
908 名前:デフォルトの名無しさん [2018/01/13(土) 10:49:24.82 .net] >>877 2007以降限定でよければL列に計算式埋め込んじゃうけどね =IF(COUNTIFS($A:$A,$G1,$B:$B,$H1,$C:$C,$I1)>0,SUMIFS($E:$E,$A:$A,$G1,$B:$B,$H1,$C:$C,$I1)-$K1,"一致データ無し")
909 名前:デフォルトの名無しさん [2018/01/13(土) 11:20:55.87 ID:8yN0Kzpj0.net] ちなみに、こんなのです。 Sub test(ByVal Flg As Boolean) Dim Hwnd As Long: Hwnd = ThisWorkbook.Application.Hwnd Call SetWindowLong(Hwnd, -20, &H80000) If Flg Then Call SetLayeredWindowAttributes(Hwnd, 0, 200, 1) '←成功 Else Call SetLayeredWindowAttributes(Hwnd, 0, 200, 2) '←コマンドボタンに誤爆 End If End Sub 変えているのは最後の引数だけなんですが。
910 名前:デフォルトの名無しさん [2018/01/13(土) 11:27:43.02 .net] >>879 Sub test1() Dim args(5) As Variant Dim arg1 As String Dim arg2 As Long Dim arg3 As Variant Dim arg4 As Workbook Dim arg5 As Collection arg1 = "test" arg2 = 123 arg3 = ActiveSheet.Cells(1, 1) Set arg4 = ActiveWorkbook Set arg5 = New Collection arg5.Add New DataObject arg5.Item(1).SetText "sample" args(1) = arg1 args(2) = arg2 args(3) = arg3 Set args(4) = arg4 Set args(5) = arg5 Call test2(args) End Sub ‘ ―― Sub test2(ByRef args As Variant) Dim arg1 As String Dim arg2 As Long Dim arg3 As Variant Dim arg4 As Workbook Dim arg5 As Collection arg1 = args(1) arg2 = args(2) arg3 = args(3) Set arg4 = args(4) Set arg5 = args(5) Debug.Print arg1 Debug.Print arg2 Debug.Print arg3 Debug.Print arg4.Name Debug.Print arg5.Item(1).GetText End Sub
911 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 13:04:46.60 ID:WLDq+ue70.net] >>881 列の挿入や削除の処理があるので、数式だと参照ズレなどが起こってしまうので出来たらVBAで処理したいと考えています。
912 名前:858 mailto:sage [2018/01/13(土) 13:29:13.07 ID:eGapce6A0.net] >>866 Excel2010を用意しました。 >>864 エクセルで「Book1」「Book2」「Book3」を開いた状態で、 「Book1」「Book2」を並べて比較している時に、 ペアになっている「Book1」「Book2」を特定する方法、 もしくは「Book1」がActiveWorkbookの時に「Book2」を特定する方法が知りたいのです。
913 名前:デフォルトの名無しさん [2018/01/13(土) 13:42:21.62 .net] >>885 計算式でできればVBAでもそのままできるやん >>859 参照
914 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 13:47:55.56 ID:fyAvIt7m0.net] 並べて比較って 人間が何かを見比べて確認しているわけだから その作業は人間がやる必要ないとおもうので 全部VBAでバックグランドで処理すればいいのではないかと単純に思ってしまう 最後に比較した結果だけ表示してあげる
915 名前:デフォルトの名無しさん [2018/01/13(土) 15:21:57.51 ID:eGapce6A0.net] >>886 比較自体は計算式でできますが、 比較する対象を特定する事は計算式でできない気がします。 >>887 挿入等によって比較したい箇所がBook1と2で異なる可能性がある為、 事前に比較の起点となる箇所を選択する必要があります。
916 名前:デフォルトの名無しさん [2018/01/13(土) 16:53:07.70 .net] >>888 > 比較する対象を特定する事は計算式でできない 意味分からん =IF(COUNTIFS($A:$A,$G1,$B:$B,$H1,$C:$C,$I1)>0,SUMIFS($E:$E,$A:$A,$G1,$B:$B,$H1,$C:$C,$I1)-$K1,"一致データ無し") この計算式を単純にVBAに置き換えて With Worksheets("Sheet1") If WorksheetFunction.CountIfs(.Range(“A:A”), .Range(“G1”), .Range(“B:B”), .Range(“H1”), .Range(“C:C”), .Range(“I1”)) Then .Range(“L1”) = WorksheetFunction.SumIfs(.Range(“E:E”), .Range(“A:A”), .Range(“G1”), .Range(“B:B”), .Range(“H1”), .Range(“C:C”), .Range(“I1”)) - .Range(“K1”) Else .Range(“L1”) = “一致データ無し” EndIf End With 行列を変数で指定できるように.Rangeを.Columnsや.Cellsに置き換えて数値で指定できるようにして With Worksheets("Sheet1") If WorksheetFunction.CountIfs(.Columns(1), .Cells(1,7), .Columns(2), .Cells(1,8), .Columns(3), .Cells(1,9)) Then .Cells(1,12) = WorksheetFunction.SumIfs(.Columns(5), .Columns(1), .Cells(1,7), .Columns(2), .Cells(1,8), .Columns(3), .Cells(1,9)) - .Cells(1,11) Else .Cells(1,12) = “一致データ無し” EndIf End With あとは必要なところを変数化してループを回せばいいじゃん Dim rngCell As Range Dim lngRow As Long ‘ ループを回すため行番号を変数化 With Worksheets("Sheet1") Set rngCell = .Cells(1, 12) ‘ 表の詳細仕様が分からないのでとりあえずK列が空じゃない限りループ続行 While rngCell.Offset(0, -1) <> “” lngRow = rngCell.Row If WorksheetFunction.CountIfs(.Columns(1), .Cells(lngRow,7), .Columns(2), .Cells(lngRow,8), .Columns(3), .Cells(lngRow,9)) Then rngCell = WorksheetFunction.SumIfs(.Columns(5), .Columns(1), .Cells(lngRow,7), .Columns(2), .Cells(lngRow,8), .Columns(3), .Cells(lngRow,9)) - .Cells(lngRow,11) Else rngCell = “一致データ無し” EndIf Set rngCell = rngCell.Offset(1, 0) ‘ 次の行 Wend End With 列の追加削除があるということだったら列番号も変数化すればいい
917 名前:デフォルトの名無しさん [2018/01/13(土) 17:00:25.96 ID:zzyV/8sb0.net] 初心者で申し訳ありません セルに入力した選手コードを選手名に置換するような動きをさせたいのですがどうするとよいでしょうか 別のシートに選手名簿は用意してありA列に選手コードB列に選手名があります
918 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 17:42:32.57 ID:8qhapkmN0.net] >>890 VBA要らん VLOOKUPでググれ
919 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 17:48:09.64 ID:8qhapkmN0.net] すまん「置換」を見落とした VBAは要るな WorksheetFunction.VLookup でやるなり、ループで検索するなりやればいい
920 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 17:50:29.11 ID:gLbKwyK9x.net] >>890 普通はセルに入力された選手コードをわざわざVBA置換するなんてことはしないで、VLOOKUP等のワークシート関数を書くけどね 置換操作をVBAで書かなきゃいけない理由はあるの?
921 名前:デフォルトの名無しさん [2018/01/13(土) 17:58:56.84 .net] >>890 >セルに入力した選手コードを選手名に置換するような動きをさせたい セルに選手コードを入力して、Enterを押した途端に選手名に置き換わるような動きをさせたいんだな?そうなんだな?
922 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 18:00:41.47 ID:gLbKwyK9x.net] >>892 検索置換のダイアログでシート内の選手コードを一括変換する、みたいな手作業の業務手順をそのままマクロ化しようとしているのかもしれないし、そういう場合はそもそもシートの設計や業務手順に問題がある場合が多い。 最初にVLOOKUP使えと指摘したあんたの感覚は基本的には正しいと思うぞ。
923 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 18:06:27.84 ID:fyAvIt7m0.net] >>890 単発ならワークシート関数でやった方が簡単 VLOOKUPで変換したのを用意しといてそれをごそっと上書きする 何回もやるなら、上記をマクロにする このくらいならマクロの記録でもいけそう 全部VBA上でやる方法もあるけどビギナーには大変でしょう こんな感じでいいんじゃなかろうか Dim i i = スタートする行 Do While Not Worksheets(1).Cells(i, 1) = "" Worksheets(1).Cells(i, 1) = WorksheetFunction.VLookup _ (Worksheets(1).Cells(i, 1), Worksheets(2).Range("名簿範囲"), 2, 0) i = i + 1 Loop シートのインデックスとかは書き換えてね 意味不明ならマクロ記録かさらなる修行をオススメする
924 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 18:07:34.63 ID:gLbKwyK9x.net] >>894 VBAに慣れてる人ならセル値の置換と聞いただけでワークシート更新イベントを使いたいのかなって思いがちだよな 俺も最初はそう思ったわ でも質問者の質問内容を推測抜きで素直に読むとそうとは限らないんだよな
925 名前:デフォルトの名無しさん [2018/01/13(土) 18:19:24.76 ID:zzyV/8sb0.net] >>893 トーナメントの結果を入力するようになっているのですが既に報告用ワークシートはあるのですが入力件数が多くなりすぎて最終的にはバーコードによる入力を試みようとしています また、その報告用ワークシートは書式が決まっており並べ替えエラーチェックのマクロが既にあるので行を入れたりして関数をいれる対応ができないという状態です >>894 入力後にマクロ実行用のボタンを押して置換するような想定でした エンターを押した瞬間変わるものでも大丈夫です
926 名前:デフォルトの名無しさん [2018/01/13(土) 18:35:21.45 ID:zzyV/8sb0.net] >>892 >>896 ありがとうございます 家に帰り次第試してみます >>895 今まではワークシート内から対戦選手の名前を探してきてコピーアンドペーストで対応していたのですが参加者が年々増えてきて(今年の見込みは約千人位)追い付かなくなってきたために速度向上を目的としています
927 名前:858 mailto:sage [2018/01/13(土) 18:44:45.15 ID:eGapce6A0.net] >>889 VBAに記述のあるWorksheets("Sheet1") の箇所を、 並べて比較でペアにしているシートに特定する方法が思いつかないのです。
928 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 19:03:27.44 ID:rZTV+Qsta.net] >>900 ファイル名とかシート名がランダムでないなら 固定値じゃないの? どんなファイル名か分からない、シート名か分からないってなら都度入力するしかないな。 データ形式で特定することもできるけど、 無駄な作業にしか思えない。
929 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 19:18:42.64 ID:gLbKwyK9x.net] >>898 こんな感じならどうかな 以下は、実行すると報告用シート内に含まれる選手コード全てを一気に置換する 複数の選手コードを含む場合も一発で置換できるはず 名簿にはコードの欄が空白の行がなく、名簿シートのA2セル以下に選手コードが入力されているものと仮定してる(A1は表見出し) セル値の一部が選手コードと一致する場合も置換されてしまうので、コードのみが入力されているセルの値だけを確実に置換したい場合、Replaceメソッドの引数のLookAt:=xlPart をLookAt:=xlWholeに変更してくれ Sub ReplaceCode Dim sh_list As WorkSheet '選手名簿シート Dim sh_report As WorkSheet '報告用シート Dim i As Long Set sh_list = WorkSheets("選手名簿シート") Set sh_report = WorkSheets("報告用シート") For i = 2 To sh_list.Range("A2").End("xlDown").Row sh_report.Cells.Replace What:=sh_list.Cells(i, 1).Value, Replacement:=sh_list.Cells(i, 2).Value, LookAt:=xlPart Next i End Sub
930 名前:858 mailto:sage [2018/01/13(土) 19:32:04.47 ID:eGapce6A0.net] >>901 ファイルのフォーマットが複数あるので、 事前にファイル名とシート名を規定できないのです。 なので、せめてペアにしたファイル同士が特定できれば、 ファイルとシートを選択する手間が省けると思ったのですが・・・ 3つ以上開けなくなるけど、workbooksからマクロブックを除外した先頭2つを比較する方法で考えてみます。
931 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 19:36:48.93 ID:6HVsHBKb0.net] >>903 それは運用を変えよう。機械的に処理するなら人間側が合わせる必要がある。 手動で命名規則に沿うか、命名自体を自動的にして人間が意識しないようにするか。
932 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 23:03:28.12 ID:aJN0Dby50.net] エクセル2010でCSVファイルを開いた場合、 UTF8やshiftjisを自動で判定して表示してくれますが、 この時に判定された文字コードを取得する方法はありますか。 用途は、外部データの取り込みでCSVを開きなおすための文字コードの特定です。
933 名前:デフォルトの名無しさん [2018/01/13(土) 23:14:29.83 ID:odSwvUdp0.net] >>905 application.nkf
934 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 23:28:32.80 ID:aJN0Dby50.net] >>906 ありがとうございます。 試してみます。
935 名前:デフォルトの名無しさん mailto:sage [2018/01/14(日) 06:58:25.18 ID:UVUQYwWb0.net] >>907 いいってことよ(´・ω・`)b
936 名前:デフォルトの名無しさん [2018/01/15(月) 01:08:16.65 ID:Zqan8uZj0.net] >>902 実行時エラー13 型が一致しませんとなっていて For~の行でエラーを出していて止まるみたいです あと報告シートが選手の強さ別に複数に分かれているのですが今選手コードの入力したシート(つまりいま開いているマクロ実行用のボタンを押したシート)を処理したいという場合どうするとよいのか教えていただけると助かります
937 名前:897 mailto:sage [2018/01/15(月) 01:48:08.96 ID:ubg4QImpx.net] >>909 エラーの出たコードを転載して見せてもらえませんか?こちらの環境ではうまく動いているんですが、私がコードを転載したときにミスをしたかもしれないので それから、コードはボタンマクロ(ボタン名_Clickのような名前のプロシージャ)として各シートのシートモジュールに書いているんでしょうか?
938 名前:デフォルトの名無しさん [2018/01/15(月) 11:28:57.27 ID:thpu0oBS0.net] >>910 Sub ReplaceCode() Dim sh_list As Worksheet '選手名簿シート Dim sh_report As Worksheet '報告用シート Dim i As Long Set sh_list = Worksheets("選手名簿") Set sh_report = Worksheets("対戦結果表_A級") For i = 2 To sh_list.Range("A2").End("xlDown").Row sh_report.Cells.Replace What:=sh_list.Cells(i, 1).Value, Replacement:=sh_list.Cells(i, 2).Value, LookAt:=xlPart Next i End Sub シート作成用のコードが既にあるのですがその中のコードを流用して各シートに実行用のボタンを置く計画でした ActiveSheet.Buttons.Add(2, 1.5, 125, 18.75).Select Selection.OnAction = "CSV_SAVE" Selection.Characters.Text = Worksheets(2).Cells(1, 1).Text & "級のCSVファイル作成" With Selection.Characters(Start:=1, Length:=15).Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 10 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone End With これのCSV_SAVEをReplaceCodeにしてボタンの名前と場所をかえるつもりでしたがあまりよくない方法なのでしょうか 必要であれば既にあるコードを出しますので教えてください
939 名前:デフォルトの名無しさん [2018/01/15(月) 11:58:16.00 ID:Vljo7f2q0.net] >>908 application.nkf オブジェクトが見つかりませんでした。 下記のapplicationオブジェクト内にも、nkfプロパティが見つかりません。 https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-object-excel オブジェクトの参照方法が違うのでしょうか。
940 名前:897 mailto:sage [2018/01/15(月) 23:02:33.00 ID:JvjYqsKWx.net] >>911 申し訳ない、For
941 名前:フ行でEnd("xlDown")となってるの、自分の転記ミスでした エラーの原因もこれでしょう 二重引用符なしでEnd(xlDown)と書き直して動かしてみてください [] [ここ壊れてます]
942 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 12:17:16.43 ID:SelV7zwId.net] 質問です。 ソルバーで普通は目的セルをrangeなどで指定しますが、シートのセルにアクセスせず、vba内の変数を直接ソルバーにかけてvba内だけで完結したいのですが、方法あるでしょうか?
943 名前:デフォルトの名無しさん [2018/01/17(水) 02:18:24.01 ID:x8yvrTsd0.net] >>913 うまくいきました ありがとうごさいます
944 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 12:24:27.92 ID:sSjH/Vu40.net] セルのA列にある文字列をコンボboxにaddですべて入れた後に、一文字入力する度に候補が絞られてくって出来ます? コード教えてもらえないですか?
945 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 12:31:05.83 ID:TVDu7Qf0r.net] 一文字入力する度にコンボボックスの候補を絞ればいいんとちゃうか? 知らんけど
946 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 13:28:17.12 ID:uuergXrf0.net] 社内に部品表があって、重複している名前を省いて部品種類一覧の表を作ろうと思ってます。 ・ネジM5 ・ネジM5 ・ナットM5 ・ナットM5 ↓ ・ネジM5 ・ナットM5 というイメージです。 自分なりに下記のマクロを組んでみました。 Dim row As Long, col As Long, D As Range col = 1 row = 1 Do Until Cells(row, col) = "" If Not Cells(row, col) = Cells(row + 1, col) Then If D Is Nothing Then Set D = Cells(row, col) Else Set D = Union(D, Cells(row, col)) End If End If row = row + 1 Loop この後レンジDをコピペするマクロです。 部品の種類が100とか200なら動いてくれますが、本来20,000件超の部品の種類があり、こちらを処理するとフリーズします。 デバックのウィンドウはユニオンのところを指定してきてるんですが、ユニオンにはまとめられる量の限界などがあるのでしょうか?
947 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 13:33:34.73 ID:wJgnfOTG0.net] >>918 Accessでやれ。
948 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 13:41:46.63 ID:CFAgCrzx0.net] >>918 ソートして重複を削除じゃダメなのか?
949 名前:デフォルトの名無しさん [2018/01/20(土) 15:03:19.74 ID:Fb/tMd6M0.net] >>918 Excel VBAでやってもいいけど、RANGEオブジェクトに溜め込むやり方よりは、素直に別シートに値をコピー、さらにそれを検索して別の値が出てきたら別シートにコピーでいいんじゃないのか? そもそもExcelのフィルタ関連の機能でもできるからVBAを使う理由がわからない。
950 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 15:06:48.01 ID:iefRLv2cp.net] >>918 dictionaryとかでだめかな?
951 名前:デフォルトの名無しさん [2018/01/20(土) 17:40:00.19 ID:91x3kJT10.net] DBMSがコンソールなんかに返した結果を Excelセルに上手く貼り付ける方法ってある?
952 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 19:41:33.47 ID:wJgnfOTG0.net] >>923 詳細忘れたけど代入する事で、そのまま貼り付けられるメソッドがあったはず。
953 名前:デフォルトの名無しさん [2018/01/20(土) 20:44:55.78 ID:Y9eKqT4m0.net] 多くは語らんけどある意味エスパーと言っておこうw
954 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 13:18:30.88 ID:+2jqUeqC0.net] >>918 ADOなら一瞬で終わる いろいろ突っ込まれているように、別の方法のが簡単だと思うけど シート名やら列名は読みかえてね Dim adocon As Object, adors As Object Set adocon = CreateObject("ADODB.Connection") Set adors = CreateObject("ADODB.Recordset") With adocon .Provider = "Microsoft.ACE.OLEDB.12.0" .Properties("Extended Properties") = "Excel 12.0" .Open ThisWorkbook.Path & "\" & ThisWorkbook.Name End With Set adors = adocon.Execute("SELECT DISTINCT 部品名 FROM [部品表$]") Worksheets("部品種類一覧").Range("a1").CopyFromRecordset adors adocon.Close
955 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 15:03:53.81 ID:pRI5Eg/X0.net] >>862 だれかこれわかる人いません?
956 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 16:45:39.61 ID:WhYlNzfJM.net] >>918 下手にマクロ組むよりExcelの標準機能の重複削除を使え。 VBAとは違って並列処理できるから速度が段違い
957 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 18:35:28.14 ID:7nwc0luUa.net] 重複なしリストはいろいろやり方あるけど、標準機能使うかadoでやるかがスマートだろうね dictionaryもありだけど、fsoのやつはなんか取り回しがいまいちじゃね
958 名前:デフォルトの名無しさん [2018/01/21(日) 18:40:31.69 ID:nVuQLEta0.net] ここ初心者スレかと思ってスレタイ見なおしてしまったわw オレ以外初心者しかおらんやんw
959 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 18:41:57.84 ID:EcNkRoqM0.net] メゾット君また寂しくなって来ちゃったのか
960 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 18:57:02.81 ID:7nwc0luUa.net] .netframeworkのlistって重複削除機能なかったっけ?
961 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 20:07:47.89 ID:+2jqUeqC0.net] >>932 リストにあるかないかはわかるみたい これなら配列に突っ込んで総当たりしていくのと変わらなそう 読みやすくはなるけど Dim partsList As Object Set partsList = CreateObject("System.Collections.ArrayList") Dim partsData Set partsData = Range("データの列") Dim parts For Each parts In partsData If Not partsList.Contains(parts.Value) Then partsList.Add parts.Value End If Next 出力処理省略
962 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 20:16:12.20 ID:rQmHQ7OM0.net] >>929 > dictionaryもありだけど、fsoのやつはなんか取り回しがいまいちじゃね 意味不明 Dictionaryとfsoになんの関係があるんだ?