Excel VBA 質問スレ Part52
■ このスレッドは過去ログ倉庫に格納されています
スレ立ての際は一行目に !extend:checked:vvvvv:1000:512 と入れてスレ立てして下さい ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※関連スレ VBAなんでも質問スレ Part2 http://mevius.2ch.net/test/read.cgi/tech/1432173164/ Access VBA 質問スレ Part1 http://mevius.2ch.net/test/read.cgi/tech/1328536426/ ※前スレ Excel VBA 質問スレ Part51 http://mevius.2ch.net/test/read.cgi/tech/1510107990/ 既にfso使ってるならそのif分の中でGetBaseNameで取得すりゃいいのでわ 酔っ払ってんのか? >>585 Dir(ThisWorkbook.Path & "\*.xls") のような感じでしょうか? (ThisWorkbook.Pathのところに何となく違和感がありますが。) >>584 If 〜 Then N = N + 1 を複数行にして If 〜 Then If N = 0 Then strFirstFileName = ff.Name N = N + 1 End If にすればいい >>586 ("Scripting.FileSystemObject") の部分、ちゃんと理解できておりませんでした・・・。 うまく使えばGetBaseNameでファイル名が取得できるのですね。 ありがとうございました。 >>588 そのコードで今回はファイル名取得できました。 勉強始めたばっかりで、難しいですが面白いです! ありがとうございました! 他のテキストエディタなどで書いたコードをvbeに貼り付けるのってダメなんでしょうか? ダイアログを表示するのに文字列を直接指定している部分が引っかかっているらしくて vbeの方で同じ文字列を再度打ち直すと正常に動作してくれるのですが 原因なにかわかりませんか? ゴミvbにunicode非対応とかなんでこんなのが現代に君臨してんだろう ありがとうございました VBAのテキストボックスの .LineCount ってどういう時に使いますか? >>594 というのも、例えばInteger型の変数iに代入しようとして、 i=テキストボックス名.LineCount ってやると、 実行時エラー '2185': LineCountプロパティの値を取得できません。このコントロールはフォーカスを持つ必要 があります。SetFocusメソッドによって、このプロパティまたはメソッドが参照されるま えにフォーカスが移動しました。 ってエラーになったもので。 >>595 さあね、SetFocusとセットで使って問題ないシーンだったら使えばいいんじゃね? なんでそういう作りになってるかはしらんけど、歴史的な理由ってやつじゃね? LineCountは全部品共通で使い回してる内部変数を参照していて フォーカスが当たってるときだけ値を保持してるとか Ruby で、Selenium WebDriver で、ブラウザの自動操作をすると、 入力コントロールに入力するには、フォーカスが必要だったかな? フォーカスは、キーボードなどの入力装置を独占するから、 OS内で同時に、1つのアプリの、1つのコントロールしか持てない それは単なるwebdriverの仕様あるいは方針にすぎん 誰か教えてください。いくら調べても分からなかった・・・ 近似曲線を引くマクロを書いて、ボタンに登録してるのですが、この動作を行うと 1回目の曲線が変な形で残ってしまう。 1回目の曲線を消したいのですが、どうしても消し方がわからない。 Private Sub CommandButton1_Click() Dim num As Integer num = MovingAvgUF.TextBox1.Value ActiveSheet.ChartObjects(1).Activate ActiveChart.ChartArea.Select ActiveChart.FullSeriesCollection(1).Trendlines.Add ActiveChart.FullSeriesCollection(1).Trendlines(1).Select With Selection .Type = xlMovingAvg .Period = num End With With Selection.Format.Line .ForeColor.RGB = RGB(0, 0, 0) .Weight = 1.5 End With Unload MovingAvgUF Range("A3").Select End Sub >>599 実行のたびにAddしているので、新しく追加されているからでしょう たぶん移動平均の期間を可変にしたいのだろうから ない場合だけAdd、すでにあれば既存のパラメーターを変更するようにする あとActivateとかSelectionは無駄なのでやめる Dim num As Integer Dim graph num = MovingAvgUF.TextBox1.Value Set graph= Worksheets(1).ChartObjects(1).Chart.SeriesCollection(1) If graph.Trendlines.Count = 0 Then With graph.Trendlines.Add .Type = xlMovingAvg .Period = num .Format.Line.ForeColor.RGB = RGB(100, 0, 0) .Format.Line.Weight = 1.5 End With Else graph.Trendlines(1).Period = num End If Unload MovingAvgUF これでどうでしょう グラフ指定(Set句のところ)はそっちの環境に合わせて書き換えてね >>600 うわ出来ました。 マジでありがとうございます。 助かりました。 VB6で計算ボタンをボタンを押すと各フォームのテキストボックスの値とか使っていろいろ自動で計算してフォームが勝手に閉じられるんですが、デバッグで1個ずつ追ってくと途中で止まってしまうのって仕方ないんですかね? gotfocusやらclickとかで途中で無理やりやってるとは思うですけど、通る順序を追うにはどうしたらいいですか? A1とB1は空白C1からZ1まで日付型がはいっています。 3月分の最後 20180330と2018331がないので20180328を拾いたい。 4月分の初め 20180401と20180402が無いので20180403を拾いたい。 日付型------------------------------ 空白 (A1) 空白 (B1) 20180325(C1) 20180326(D1) 20180328(E1) 20180403(F1) 20180405(G1) 20180406(H1) ・ ・ ・ 20180505 ------------------------------------------ Sub 日付 Dim 最小数 As long, 最大数 As long 最小数= WotksheetFunction.Dmin(Rnge("1:1"),range("C1"),"200180401") 最大数= WotksheetFunction.Dmin(Rnge("1:1"),range("C1"),"200180331") End Sub ---------------------------------------- これだとうまくいかない・・・・。 何か間違っているのでしょか・・・? 何がしたいのか説明を読んでもコードを見てもさっぱりわからん わからんけどエスパーすると”201803”で検索して最後に見つかったセルと”201804”で検索して最初に見つかったセルでいいんじゃないの? >>604 です。 >>605 説明が下手でごめんなさい。 20180401〜現在までのデータをダウンロード(システム仕様の為、細かい設定が出来ない) ■データのフォーマット■ 土日祝はデータがない。 A2とB2からA○B○まで製品番号と製品名が入っている。 ↓ 4月分、5月分、6月分、、、、、 分けるように作りたい。 ※AとBは残す 月初と月末の日付が入ってないとずれてしまう。(セル取得が出来ない。) MID("20180325",5,2)で"03"が取り出せるから、それで判断すればいいんじゃないの。 色んな日付上の制約があるならLEFT(),MID(),RIGHT()使い分けで。 >>607 ありがとうございます。 その方法がありましたね・・・。 勉強になります。 ------------------------------------------------------------ 関数 {=MIN(IF(20180201<=1:1,1:1,""))} {=MAX(IF(20180231>=1:1,1:1,""))} これだとうまく行きますが、VBAだとどうやって作るのかなと思っていました。 >>609 その方法になりますね。 私は勉強不足ですみません。 m(_ _)m 自動車業界で例えると 1、トヨタ、日産、ホンダ 2、1の下請け企業名 3、2の下請け企業名 4、3の下請け企業名 . . . としたとき、2のAの企業名を入力したらそこからの下請け企業を抽出したいんですが、その場合のエクセルのシートの作り方をどのように作れば効率がいいですか? シートAAAにあるテーブル1の種目という項目のデータを ComboBox1のリストに代入するのは下記マクロでできました Private Sub UserForm_Initialize() Dim KV As Range Set KV = Sheets("AAA").Range("テーブル1[種目]") With ComboBox1 For i = 1 To KV.Rows.Count .AddItem KV(i) Next i End With End Sub さて、ここからが質問です テーブル1にフィルターをかけた後に、フィルターで残った種目という項目のデータを ComboBox1のリストに代入するのはどうしたら良いのでしょうか? よろしくお願い致します 伝票番号 顧客名 商品名 数量 価格 金額 というデータがあり、同じ伝票番号に3〜6行の取引データがあります (1枚の伝票に複数の商品の販売記録がある) 同じ伝票番号の行を、1行残して削除し、1伝票番号に1行というデータに作り替えたいと考えてます。 対象となる行数は50万行 今は、ある伝票番号の一番上の次の行と その伝票番号の一番下の行を範囲で削除し、 この処理を繰り返しているのですが、とても時間がかかります どういう方法なら早く処理できるでしょうか? >>611 ExcelよりAccessの仕事なのでAccessがあればそちらをオススメしたい Excelでやるならワークシート関数がいいと思う データが正規形になっていればあとからいかようにでもなるので シートは1枚でもいけるんじゃないかな(たぶん) >>612 フィルター後のセルだけをとってくるメソッドがあったはず 頻繁にフィルター条件を変えるなら、最初に全部配列につっこんで あとは配列をフィルターしたほうがパフォーマンスが出せる >>613 単純に重複を削除したいだけでしょうか? ぶら下がってるデータを1つにまとめつつでしょうか? 単純に重複削除ならフィルターでできたはず もしくはRemoveDuplicatesというメソッドで つかい方はこちら https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/range-removeduplicates-method-excel >>614 >>615 ありがとうございました!とても参考になりました! 質問です。 Dim Wb2 As Workbook buf = Dir(ThisPass & "\" & strfirstfilename) Do While Len(buf) > 0 If LCase(buf) Like "*.xls" Then buf2 = Left(buf, InStrRev(buf, ".") - 1) End If buf = Dir() Loop Set Wb2 = Workbooks(strfirstfilename) ←”インデックスが有効範囲にありません” というエラーが発生します。 strfirstfilenameには”AAA_original-コピー.xls”が入っており、ここまではOKです。 なぜインデックスが有効範囲にないのか・・・。 どなたか教えてください。 よろしくお願いします。 >>617 ファイルシステムの場所を示す「パス」はpassじゃなくてpathだよ まとめるとこう Set Wb2 = Workbooks.Open(ThisWorkbook.Path & "\" & strfirstfilename) >>618 開いてなかったですね・・・。 ありがとうございます >>619 pathですね。お恥ずかしい・・・。 ありがとうございました。 >>620 このプログラムの直後に Workbooks.Open (ThisPath & "\" & strfirstfilename) があったので、それをsetの前に持ってきて成功しました。 ありがとうございました。 >>620 だと昔のExcelじゃ動かなかった歴史的経緯がある ダイアログシートって使ってる人おる? ちょっと前客先で初めて見てたまげたわ >>624 openだと開かない?って事??何故? >>626 Openで開くけど、Workbookオブジェクトは返ってこなかったから 別途Workbooks(…)で取得する必要があった >>627 そんな事が... だとすると、「その頃」であれば、>>623 の対策が正解だったわけだw 質問です。 ピボットテーブルのフィルターで特定の日付を絞りこみたいのですがどうしたら良いでしょうか? マクロの記録を使用したり、「ピボットテーブル フィルター 日付」などで検索しましたが出来ませんでした。 関係があるかはわかりませんが既存の日付フィルターも選択出来ない状態になっています。 ご存知の方がいれば教えていただけないでしょうか? よろしくお願いいたします。 質問です とか 教えてで始まる質問をするのは厚かましい馬鹿ばっか >>629 それはもしかしてピボットテーブルを使わなくても出来る内容なんじゃないかと思えてならない >>632 返信ありがとうございます。 仕事で使用しているのですが別シートにデータを入力して、ピボットテーブルの行エリアに型式、列エリアに出荷日と納品先を指定していて、翌日出荷分などを抽出したい状態です。 デバッグ停止した時をイベントとして動く仕掛けが欲しい 画面描画更新抑止解除とか書くの面倒 >>637 しょっちゅうやらかすんならIMEに単語登録しといてイミディエイトウィンドウで実行 >>633 フィルターだか、スライサーだかで普通に出来なかったっけ? 出来ないならなんか設定がおかしいと思う。 まずはデータピックアップして、小規模のデータで試してみたら。 あと、スレチな上に質問レベルも低いからその程度のことはもっと自分で調べるくせをつけた方がいい。 ブックやシートの構成がどうなっていて、どうしたいのかさっぱり判らんから テスト用のデータを付けたブックをうpしたほうが早い。 んで、自分は何処まで出来たのかをも付けて そしたら、それに対して少しはレスが付くかもだなw >>639 ここで聞くこともネットで調べる事の一つ 自分がログインした環境で開く全てのブックに右クリックメニューを追加する方法教えて googleはエスパーしてくれないからな。ここなら大体何をやりたいか汲んで答えてくれるだろうと。 オレなら、まずジュンク堂に行ってエクセル関連本を片っ端から立ち読みして自分の欲しているモノが書いてある 本を買うね。その結果、「なんだ、簡単じゃねえか本買って損した」となったとしてもそれが血になり肉となるって事だよな。 バカだからエクセル本を読むのかエクセル本を読んだからバカになったのか それが問題だ >>647 字を読めない、本買う金がないトンスルジジイは書き込まないでww トンスルランドへ帰ってウンコ酒醸造に勤しんでくれやキム >>646 その知識を惜しげもなく教えてあげるのもVBAの裾野を拡げる事になりみんなが感謝する ありがとう そもそもVBAの質問じゃないし VBAの意味すらわからん馬鹿か、無視して書き込んでくる奴なんだろ >>647 今回は「バカだからエクセル本を読んだ」が正解の模様 ところで、VBAのPython対応っていつからの話なの? 機械学習でpython3やりまくってるワシは生き残れるのかのう? ちなみに丙午です >>645 アドインとCustomUI勉強してみな 最近VBAを触り始めて、言語と言われてる理由がなんとなく分かったんだけど これを習っていった時に、せけんて"難しい"と言われるのはどういう部分になるんだろう? 作業を うーん、途中送信しちゃった 出直してきます おやすみなさい >>657 プログラミングが初めてなら、何もかも難しいと感じるだろうし、 他のプログラミング言語が1つだけ使える人にとっては、その言語とVBAの文法などの違いにいちいち驚く 複数の言語が使える人なら、Excel固有のオブジェクト階層あたりを面倒と感じるんじゃないかな 例えば一つのテキストファイルを扱う時のパス?アドレス?ってどうやって扱ってます? 2つ以上のモジュールで使う場合ってやっぱグローバル? >>662 一回の実行で処理するなら関数の引数で受け渡し 複数回実行するなら非揮発領域(隠しシートやレジストリ等)で受け渡し >>662 ユーザー定義型(構造体)作る そのメンバー変数にファイル名用を定義 ユーザー定義型のインスタンス作ってモジュールにはそのリファレンスを渡す グローバル変数は極力使わない >>662 処理内容による 別モジュールをCallで呼ぶなら引数で渡す >>664 そのユーザー定義型のインスタンスはどこにどういう形で保持しておくの? 複数回使うという話だったから。 質問です。 条件付き書式でやろうと思ってましたが、データが10,000行になったため、VBAを使いたいと思います。 例えば、 データ範囲をRange("A1:Z100")として、 A1に入力された数値が1だったらA1からZ1を赤色にする、 A1に入力された数値が2だったら黄色、 A1に入力された数値が3だったら青色、という風にするにはどうしたらよいでしょうか? A列に入力される文字は1〜8の数値のみです。 コマンドボタンを押したときに一気に処理をしたいのですが、 A1が1ならA1からZ1の色を変える、というのがわかりません。 どなたかご教授いただけないでしょうか。 よろしくお願いします。 >>667 全くわからないから全部教えろってこと? >>668 i = Ws2.Range("A10").End(xlDown).Row With Worksheets("Sheet1").Range(Cells(9, 1), Cells(i, 28)) Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$A9=1" Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority With Selection.FormatConditions(1).Interior .PatternColorIndex = xlAutomatic .TintAndShade = 0.399945066682943 .Color = 13408767 End With という条件付き書式のコードを考えましたが、これ以外の方法をさがしています。 A1が1ならA1からZ1の色を変える、というのが本当にわからないので、 ヒントだけでもいただけないかと・・・。 >>669 よく、ネットや書籍で「マクロの記録で生成されたコードを基にほにゃららしよう」ってな記事を見かけるけど、 あんまり良くない方法な気がする。最初は退屈でも我慢してマトモな入門書を見ながら基礎をやった方がいい。 10万件以上のデータ処理にはアクセスを推奨 それぞれに得意分野があるのだから使い分けなさい エクセルVBAがらアクセスデータを引っ張る でデータをエクセル側で計算なり加工なり表なりをやるのが良い >>670 ありがとうございます。 基礎知識がないのにネットで見つけた色んなコードをつなぎ合わせて作っていたので 無理がきました。 >>671 ありがとうございます。 今回扱うデータは最大1万件くらいでしたので、エクセルでも出来るかと・・・。 あとアクセスがないパソコンで使用することがあるので、 多少遅いのを覚悟でエクセルで作成していました。 ありがとうございました。 勉強します。 >>669 まずはプログラムの基礎から始めないとダメだろうな。 forを使って自分で考えてご覧。 メゾット君はソープとか行く上に嬢に対して「考えてごらん」とかリアルに言い出すのか。それはキモいな。 >>675 ←ごらんて言った覚えがあるソープ通www ごらんと言われたからというわけではないですが、作ってみました。 Dim iro As Long Workbooks("test.xlsm").Worksheets("sheet1").Activate For iro = 10 To i If Cells(iro, 1) = 1 Then Range(Cells(iro, 1), Cells(iro, 28)).Interior.ColorIndex = 33 ElseIf Cells(iro, 1) = 2 Then Range(Cells(iro, 1), Cells(iro, 28)).Interior.ColorIndex = 34 ElseIf Cells(iro, 1) = 3 Then Range(Cells(iro, 1), Cells(iro, 28)).Interior.ColorIndex = 35 ElseIf Cells(iro, 1) = 4 Then Range(Cells(iro, 1), Cells(iro, 28)).Interior.ColorIndex = 36 ElseIf Cells(iro, 1) = 5 Then Range(Cells(iro, 1), Cells(iro, 28)).Interior.ColorIndex = 37 ElseIf Cells(iro, 1) = 6 Then Range(Cells(iro, 1), Cells(iro, 28)).Interior.ColorIndex = 38 ElseIf Cells(iro, 1) = 7 Then Range(Cells(iro, 1), Cells(iro, 28)).Interior.ColorIndex = 39 ElseIf Cells(iro, 1) = 8 Then Range(Cells(iro, 1), Cells(iro, 28)).Interior.ColorIndex = 40 End If Next iro なんだか長いコードになってしまいました・・・。 すっきり出来ると良いのですけど、今はこれが限界。 ありがとうございました。 >>666 メインモジュールとして起床した場所に保持すればいいよ シートイベントにそれを渡したい場合もインスタンスを参照させればいい $('tr:first > td').css('background-color','orange'); JavaScript のjQuery なら、これで、 表の1行目(tr)のすべての列(td)の、背景色を変更できる >>679 それだと>>664 が言う「グローバル変数を極力使うな」が満たせないので困る >>678 VBAなんてテクニックに凝らなくていいよ 他人の書いた「俺頭いいwww」っていうVBAを読み解くぐらいなら、長々とベタに書いてあった方がマシ 本当に初心者で困ってます。 画像みたいなマクロを組みたんですが、どなたかご教授お願い致します。 https://dotup.org/uploda/dotup.org1508286.png ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる