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)
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になんの関係があるんだ?
963 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 21:00:25.33 ID:xouI7cQH0.net] >>918 とりま、Union関数は遅いから絶対に使うな、それだけ セル数がちょっと増えると簡単にフリーズする 普通に配列とかに入れてった方がいい
964 名前:デフォルトの名無しさん [2018/01/21(日) 21:12:55.02 ID:nVuQLEta0.net] >>935 とりま、なんでいきなりそれを言いだしたのかよく分からんが 遅いのはお前のプログラムが下手糞なだけ 脈絡のない下手糞自慢ごくろうさん
965 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 21:38:18.50 ID:Ycn/1JW20.net] require 'set' File.readlines("ファイル名").to_set.map { |item| puts item } Ruby の集合を使うと、以下のような行区切りのファイルを、 あ い あ あ う い 以下のような結果にできる。 ただし、集合にはデフォルトで、順番は無いので、 順番が必要なら、お好みの基準でソートする あ い う
966 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 21:51:29.18 ID:EcNkRoqM0.net] 毎度思うんだが、Rubyって他言語のスレにまで布教しに来なきゃならないほど不人気なのか?
967 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 22:19:18.53 ID:Ycn/1JW20.net] Ruby だと、テキスト処理が、めちゃめちゃ簡単に作れる 他の言語のように、悪戦苦闘しない
968 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 22:23:07.58 ID:+2jqUeqC0.net] どうせなら引っ越し準備も兼ねてPythonにしようゼ
969 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 23:23:35.81 ID:ppfN03med.net] 単純に2万個のセルをUnionするだけで1時間かかる Sub aaa() Debug.Print Time Dim u As Range Set u = Cells(1, 1) For r = 3 To 40000 Step 2 Set u = Union(u, Cells(r, 1)) Next Debug.Print Time End Sub
970 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 23:45:19.36 ID:Ycn/1JW20.net] 2万個のデータは、テキストデータだけなら、1MB ぐらいだろ >>937 のRuby でのテキスト処理なら、1秒ぐらいじゃないか?
971 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 00:04:49.43 ID:R+7srG110.net] >>942 空気読んでね
972 名前:アこはテキスト処理の質問スレじゃなくて Excel VBAの質問スレだから [] [ここ壊れてます]
973 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 01:20:01.78 ID:pYe1Cwj70.net] そんなに時間が掛かるのなら、一旦データをエクスポートして、 データをテキスト処理してから、インポートして戻せば? たかが、2万個のデータで、1時間は現実的ではない そんなに時間が掛かっても、どうしても、VBA でやりたいのか?
974 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 01:43:29.00 ID:zmIcszTc0.net] あくまでUnionを使った場合であって高速に処理する方法はいくらでもあるからなぁ。 それに仕事でVBA使う環境だと他社との協調も考えなきゃいけないからRubyインストールする方がよっぽど非現実的だし。 まぁ、たぶんおちょくってるつもりなんだろうけど、そもそもVBA以外の環境がないって前提のスレだから、 Rubyマンの煽りが煽りになっていないっていう・・・。
975 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 04:08:31.22 ID:Xp9Ai2fT0.net] 重複の削除はワークシートでやった方がてっとり早いと思う
976 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 04:38:17.99 ID:AE7SVx7N0.net] >>945 > そもそもVBA以外の環境がないって前提のスレだから そんな前提で質問に来る人もいるだろうけど、 「最適解」を求めている人が、とりあえずVBAだとどうなるか、と思って質問する場合もあるでしょ だから、質問者が「全体にVBA以外はダメ」って制限をかけていない限りは、 上でも、ACCESSを進めている人もいたけど、実用面から考えた回答も質問者の利益になると思うんだけど (質問者がそう思っていても、何も知らないからそう思ってるってパターンすらあり得るかな)
977 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 05:56:27.49 ID:zmIcszTc0.net] >>947 Excel VBA質問スレでの「実用面」は、一般的な企業向けWindows PC(Office製品入り)で出来る事に制限されると思うけど。 それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。 だいたい他の言語に興味があるなら、その言語のスレで質問すりゃいいわけだし、 どんな自己弁護をしたところで特定言語のスレで他言語の話をする理由にはならないよ。 せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、 Rubyスレに誘導して、そちらで話を展開すべきだね。
978 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 08:37:35.39 ID:AE7SVx7N0.net] >>948 > それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。 リアルでも、相手に聞きもせずに勝手にそんな縛りをかけて要件定義する人はいないと思うよ > せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、 > Rubyスレに誘導して、そちらで話を展開すべきだね。 環境を聞くのは勿論ありだが、「○○だとより簡単にできるよ」ってこちらから言う事に何の問題があるのか? 今ある環境内で必ず実現する必要があるなら別だが、そうでない場合もよくあることでしょ ま、いずれにせよ、何も聞かないうちに勝手に「○○に違いない」って決めつけるのは、 要件定義では一番しちゃいけないことだよ
979 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 10:06:54.55 ID:zmIcszTc0.net] >>949 仕事している風を装いたいんだろうけど、明らかに経験が無いの丸出しなんだよな・・・。 そもそもVBAスレでRubyの話を出してくる事自体が問題なんだよ。 君が問題になっているのは要件定義の話ではなく開発環境の話だ。 明確な線引きをするなら、このスレではxlsmに記録し、特別な準備なしに実行できるものでなければ、何であれ許容範囲外だ。
980 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 10:12:50.46 ID:JFwvghX1M.net] またそうやって明文化されてもいない自分ルールを展開していくー
981 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 10:23:32.81 ID:zmIcszTc0.net] 明文化されてはいないけど、過去から今までのスレでの反応を見る限りは、 だいたいxlsmファイル単体でマクロの実行が補完できるかどうかが拒絶反応の出る出ないを分けてるよ。 ただ個別にマクロが記録された二つ以上のファイルを連携させる場合の話もあるから「xlsmに記録し、準備なしに実行可能な」と定義しただけ。 押しつけるつもりはないけど、この定義で問題が無ければテンプレに加えてキチ避けしてほしいくらい。
982 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 11:30:49.09 ID:r0T2WJT6a.net] >>934 ごめんscriptingRuntimeのやつ、の間違いだ
983 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 11:33:07.33 ID:y0jssaARd.net] VBAをメインとして他言語も補助的に使う。 それなりにあると思う
984 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 15:12:56.07 ID:EwN8a0pa0.net] 同じ現象が起きるようにできるだけ簡単なコードを用意しました まっさらなxlsmにUserForm1を挿入し、TextBox1とTextBox2を横に並べます UserForm1モジュールに下記のようにコードを記述します Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 39 Then With TextBox2 .SetFocus .SelStart = 0 End With End If End Sub UserForm1を呼んだ後、TextBox2にabと記入します このとき、TextBox1からTextBox2に矢印キー右でうつろうとするとaの前ではなくaとbの間にカーソルが来てしまいます。 どうすればaの前にカーソルが来るようになりますか?もちろんabは例示にすぎずいろんな文字列が入ります よろしくお願いします
985 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 15:25:33.05 ID:EwN8a0pa0.net] >>955 ですけど、KeyCode=40、つまり矢印キー下にセッティングして TextBox1から2に移ると頭にカーソルきますね ということは、入力した矢印キー右がTextBox2に移ったあとも生きててその影響が出てるってことですかね まぁ原因分かっても解決方法が分からないのですが
986 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 16:37:43.27 ID:DgxtyBXU0.net] 試していないけれど With TextBox2 の前に KeyCode = 0 を入れたらどう
987 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 17:07:09.72 ID:+/nnDvsjM.net] >>954 VBAでは書きにくい or 実行速度がめちゃ遅い かつ その言語なら簡単に書ける or 実行速度が速い ならありうると思う なのでAccessとかADOならまだわかるけどRubyはないな