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)
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はないな
988 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 22:49:33.42 ID:EwN8a0pa0.net] >>957 しゅごい・・・できました ありがとうございました
989 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 10:46:16.37 ID:QE61Ho6h0.net] 。と。の間に入ってる文字を全部同じ文字に置換したい場合ってどうすればいいでしょうか? 。。 →。ccc。 。akok。 →。ccc。 。3293i9ia。 →。ccc。 みたいな感じです
990 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 11:16:56.30 ID:QE61Ho6h0.net] すいません数式の中の。と。の間の文字を置換でした
991 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 12:30:55.33 ID:4OtF4psx0.net] 数式の中のってのがよくわかんないから実際の数式を書いてくれ
992 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 13:09:34.71 ID:QE61Ho6h0.net] こういう事がやりたいって感じです わかりづらくてすいません =123456789(この9桁の数字はランダム) → =123ccc789 =123456789(この9桁の数字はランダム) → =12ccc3456789
993 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 13:24:33.86 ID:96uZKYcfd.net] >>963 。の話はどこへいったんだ?
994 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 13:52:49.81 ID:QE61Ho6h0.net] いやこっちの方がわかりやすいかなとw
995 名前:デフォルトの名無しさん [2018/01/24(水) 14:37:17.59 ID:626EYBnb0.net] 2週間くらい前から、 フォームコントロールのボタンを配置すると エクセルファイルの起動が いつもの起動時間の5倍くらいかかる様になり困っています。 ちなみに、新規のファイルでも同じ現象になり、 他のパソコンでも同じ現象になっています。 どなたか、解決方法を知らないでしょうか? 今使っている環境は Windows 10、バージョン 1709 Excel2016 バージョン 1712 です。
996 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 14:47:11.88 ID:LHEOU22dM.net] >>965 草生やしてんじゃねえよ真面目に質問しろ
997 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 16:00:42.34 ID:eVK1iV6m0.net] w
998 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 17:24:26.92 ID:QE61Ho6h0.net] なんでwなんて打ったのか・・・反省してます
999 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 17:48:11.23 ID:cTEKAhE2M.net] >>969 VBA 正規表現 置換 でググれ
1000 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 19:49:39.94 ID:4OtF4psx0.net] >>963 みんなこれでわかるの? 上と下に規則性があるように見えないんだが 上は値を置き換えてて、下は挿入してるよね
1001 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 20:02:49.35 ID:XHxrtrwiM.net] わかりません
1002 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 21:10:53.71 ID:6b5evSsja.net] >>918 そのテキストファイルがCSVファイルみたいにカンマ区切りで ヘッダとして項目名が付いてて項目名に重複が無ければ そのファイルにSQLぶん投げて結果セット取ってこれるんだけどなぁ
1003 名前:デフォルトの名無しさん [2018/01/24(水) 21:14:29.60 .net] 地道にループぶん回してFomulaLocalとInStrとMidしてちょ
1004 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 21:29:25.29 ID:l13g0WQj0.net] いや、ループするにしても VbScriptingDictionary使うかCollection使って 値をキーとして登録して 同じキーがあれば無視、無ければ登録追加で 最後にその取っておいた内容を 展開するようにすればそこそこのレスポンスで 行けるんじゃないかな。 SQLで行けるならそれが最速だとは思うけど。
1005 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 19:41:38.87 ID:x0ph6Erf0.net] ちゃんとしたDBMSならともかく、エクセル表にSQL投げて実行速度が速いとか考えられんけど
1006 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 21:14:11.87 ID:xVw6nJl50.net] ADOだとそれなりに早いイメージなんだけど 実際はどうなのかね 誰か検証していてもよさそうだが
1007 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 22:04:13.28 ID:BYFi0PM80.net] 一項目だけの比較なんかだとVBAでやるのと変わらないけど、色々と条件が増えていくとSQLの方が速度が落ちにくい。 あと他の誰かが見ることも考慮すると、SQLで見えるようにしておいた方が分かりやすい。 ただExcelでSQLというのは絶望的に使いづらい。
1008 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 22:28:41.91 ID:3kW0jqmr0.net] UPDATEはできるけどDELETEができないんだっけ?
1009 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 22:46:48.37 ID:2HN+h3+60.net] できなくてもやらなきゃいけない時があるんだよ男にはな
1010 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 10:16:15.47 ID:i1V2CYFLa.net] エクセルのテーブル機能ってどうなんよ あんまり使わんから馴染みないんだけどsql使いやすくなったりせんの?
1011 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 14:00:22.47 ID:ewTTza6/0.net] >>980 猫もだよ 穴に逃げた虫を懸命に取ろうとしている
1012 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 19:52:38.86 ID:uoysLyn50.net] こういうのを見ると 早くPython導入して欲しいって思うよな アンケート取られてたからちょっと入門見たけど結構面白いわアレ こういった集約的なことに関してもずっと楽に作れそう VBやC#でも後の方で覚えることになるラムダ式や イテレーターとかごく基本的な当たり前のこととして いきなり最初から出てくるし
1013 名前:デフォルトの名無しさん [2018/01/26(金) 20:26:28.69 ID:Vo+OzJVu0.net] VBAですら暴走しまくりのお前らにpythonなんか与えたら社会を困らす力作マクロ()がますます増えちゃうじゃんかw
1014 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 20:36:36.35 ID:VXa7znFt0.net] コードをまともに読み書き出来ないメゾット君が心配するような事でもないけどな
1015 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 22:00:17.36 ID:mlDN6tJ0d.net] VBAを廃止なんてできるわけないからPythonと入り乱れたプログラムになるんだろーか?
1016 名前:デフォルトの名無しさん [2018/01/26(金) 22:15:41.07 ID:pXxYwYu40.net] 職場の環境じゃVBAくらいしか選択肢がない
1017 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 22:23:52.83 ID:Ji/nweCn0.net] >>987 https://forest.watch.impress.co.jp/docs/serial/yajiuma/1097447.html
1018 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 22:40:51.06 ID:VXa7znFt0.net] 影響するのは最新バージョンだけだろうし、Excel版Pythonの初期バージョンだと使い物にならなかったり参考文献が少なかったりの問題で、 本格的に使われるようになるにしても五年以上かかりそう。そしてそこからさらに数年経たないと、そのバージョン使う会社が出てこなさそう。 っていうか今までもVBAをVB.Netへ移行させようとして失敗してたらしいし、AIブームに乗じた一時的なもんで実現しないんじゃないの。
1019 名前:デフォルトの名無しさん [2018/01/27(土) 00:23:34.40 .net] Pythonって起動にめっちゃ時間がかかるから(5秒くらい) 普段使いのちょっとしたツール作るには使い物にならないという印象
1020 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 00:36:59.48 ID:Xe+uGT7T0.net] 多分Python載ったとしてもしばらくはVBAと共存だろうとは思う。 勉強嫌いな爺さん達にはPythonが来るのは驚異以外の何物でもないかも知れないけど 導入されたら少なからず徐々に普及し始める。 なぁに、EXCELの中のコンパクトに纏まった世界の話だし 勉強するにはうってつけだと思う。 少なくとも今後のVBAよりは次に繋がるよ。
1021 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 01:00:30.81 ID:/Onm91iZa.net] 今まで言語を変えるような具体的な話は出てなかったからなぁ まさかObject指向言語じゃなくていきなり関数型言語が来るとはなぁ
1022 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 01:49:19.54 ID:mMQhkopa0.net] PythonはAIブームの収束と共に消えていきそうな雰囲気だから将来性っていうと疑問が・・・。
1023 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 08:00:53.71 ID:lEBNH3fnr.net] ツッコミどころ多すぎだけどとりあえずw オマエがギモンを感じるなw
1024 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 08:16:06.57 ID:ZgMGVzLO0.net] >>990 > Pythonって起動にめっちゃ時間がかかるから(5秒くらい) さすがにPC買い換えようよ...
1025 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 11:01:00.79 ID:Nudrd5lRF.net] Excel Python 質問スレ mevius.2ch.net/test/read.cgi/tech/1517018055/
1026 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 14:29:11.91 ID:arqbrGPuM.net] VBAがくっそ使えない言語だから普通はpython大歓迎でしょ…
1027 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 15:20:10.85 ID:cbFXqoc10.net] VBA嫌いじゃないけど、Phythonの方が明らかにエレガントなコーディングできそうだから歓迎しかないわ VBAは参照設定したら使える程度のものになるんじゃないか?
1028 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 15:44:26.54 ID:+7hAxrT3a.net] どんな言語だってできる奴はできる。 VBAが駄目だとか言う奴に限って碌なコード書けない奴ばかりなんだよなあ。
1029 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 16:05:43.43 ID:arqbrGPuM.net] こんな書いててストレスマッハの言語はないからな まあ全員パイソンいくでしょw
1030 名前:デフォルトの名無しさん [2018/01/27(土) 16:11:26.72 ID:3QIsbpwxM.net] VBA→javascript→Pythonの順に覚えたけど何がそんなにストレスなのかよく分からん
1031 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 17:39:06.57 ID:Xe+uGT7T0.net] それより次スレは?
1032 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 19:59:27.66 ID:QIG/4o8/0.net] >>998 パイソンやとスレで相談したいときに 質問スレではインデント崩れて悲惨なことになってるな
1033 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 20:30:03.5
] [ここ壊れてます]
1034 名前:6 ID:Xe+uGT7T0.net mailto: とりあえず次スレ立てておいた Excel VBA 質問スレ Part52 http://mevius.2ch.net/test/read.cgi/tech/1517052305/ >>1003 Pythonはスコープがインデントで決められているからね インデントの重みが他の言語のそれとは全く違う 代わりにEnd IfやEnd Subみたいなものがない [] [ここ壊れてます]
1035 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 22:07:33.55 ID:845Tmzax0.net] >>1004 乙 1000ゲット
1036 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 80日 10時間 41分 3秒
1037 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています