Excel VBA 質問スレ Part52
レス数が1000を超えています。これ以上書き込みはできません。
「プログラミング環境なんて数年おきに改訂され進化していくもの」
という感覚は正しい。
しかしあたりまえが通じない世界もある。
それが、「廃れた開発環境」と「リソースの足りないプロジェクト」だ。 Excel2010以降で、コンテキストメニュー追加するとき
commandbars().add
でコメントを右クリックした時のメニューは()の中は何になりますか? ひょっとして、無指定だと何のショートカットキーが表示されるか(「開く(O)」みたいなの)を聞きたいのではなく(表示されないやろ…てか試せばよくね?と思ってた)、
commandbarsの引数に何を指定すればVBAのエディタのコメントを右クリックしたときのコンテキストメニューに項目を追加できますか?っていう質問なのか?
何の質問をしているのかまったく分からなかったが、がんばって一番意味が通りそうな解釈をしてみた どなたか知恵をください
日本語IMEの変換候補がドロップダウンリストで出てくるアレを
区切り記号入れて(カンマがいいかな)
一つのセルに列挙できませんかね?
例えばA1に半角英で「yama」と入力したら
B1に「山,ヤマ,やま,耶麻,耶摩,八馬,矢間」みたいな >>211
できる
基本的にはImmGetCandidateListかImmGetConversionListを使う
IMEの制御はドロ沼だからあんまり完璧を求めないようにほどほどにな >>212
即レスありがと!
そこのリファレンス読んでくるわ! MACでエクセルを使用して、ボタンクリックでphpを実行させてデータを取得してエクセル
に出力する方法を教えて下さい。 ここはエクセルの質問スレちゃうの?、あほばっかだな。 10万件くらいのリストを作ってそれをある規則で並べかえたいんだけど、一番高速で行うにはどういう手法がありますか? お前がやらずに、出来る奴に
キチンと敬意と対価を払って
やってもらう
ノウとかハウとかは後で身に付けたらいい Ruby なら、VBA より速いし、そんなに難しくない Worksheet_SelectionChangeのコード中に、
If Target.Count=1 then Exit Sub
のところで今日急にオーバーフローのエラーが出るようになって
ちょっとググったらCountLargeというのがあることを知ってとりあえず解決したんだけど
一つのセルしか選択肢てないのに・・・
ウォッチ式にTargetを追加して確認したらTargetの中にItemはひとつしかないのにTarget.Countはオーバーフローってなんだこれ? コピー禁止
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.CutCopyMode = False
End Sub
コピー→別のファイル(Excelなど)に貼り付けが出来てしまう
コピー→マウスを動かすだけでキャンセルするようなVBAはないよね、、、。 >>209
コメントアウトのコメントじゃなくてセルに付与するコメントのことだぞ フォルダに大量に入ってる動画ファイルの名前と容量を抽出してエクセルファイルに出力したり出来ませんか? とりあえずファイル操作は全部FSO使っておけば何とでもなる ちょっと横からで申し訳ないです
>>233に似たようなことをFSOでフォルダ内のファイルを数万件取得していて、foreachで一つずつ配列にいれてるんだけどかなり時間がかかる。。一括で取得する方法とかありますかね? エロ動画フォルダに入ってるファイルサイズ取得して一致したらかたっぽを削除するマクロ作ったわ そんなもんフリーソフト落としてくるだけで出来るわ。
一覧表に起こしてアレコレしたいときに捗る >>233
エロ動画を大量に集めすぎてどこに何があるか微妙にすぐ見つけれなくなった俺と同じ悩みなんだろうか Function func(ByVal arg) As int
処理
End Function
Dim var As Function
var = address(func)
Call var(argument)
みたいに、関数へのポインタでコールするのはどう書くの。 >>244
Dim var As Object
Set var = Ref(func)
Call ByRef var(argument) PowerShell なら以下で、ファイル名・サイズを、カンマ区切りで表示できる
cd で、そのフォルダへ移動してから、
ls | %{ $_.Name + "," + $_.Length }
結果をファイルに出力するなら、
ls | %{ $_.Name + "," + $_.Length } > ファイル名
出力
test01.rb,341
test02.rb,216
test03.rb,453 結果をファイルに出力するなら、
ls | %{ $_.Name + "," + $_.Length } > ファイル名.csv でたwwwエクセルとcsvの区別がついてない奴wwwww ブックオープン時にフォームだけ開きたい場合ってどうしたらいい? クラス継承前提で設計してしまったのだが、どうしてくれるの。 >>252
ポリモーフィズムはImplementsがあるから、あとはどうにでも工夫できるやろ スーパークラス作ってそれをオーバーライドしてけば省力化できると思ったのかな? 正直VBAのクラスは他のObject指向言語に比べるとその辺見劣りするのは仕方ない。元々構造化言語だし。
そこをどうするかを考えて行くのが醍醐味でもあるんだけど
やっぱり移譲にも限界があって例えばフォームを継承してもっと機能を追加したり変更したりしたいとき、
.Net系であれば単純に継承してメソッドやプロパティを追加やオーバーライドすれば良いものが、
移譲の場合は全て呼出し口を設定しなければならなかったりするので
こういう場合は余り現実的とは言えない。
移譲や継承を使うのとはまた違った方法を考える必要があるんだけど
それを考えるのもまた醍醐味。 他に現実的な解法が無いからVBA使っているだけで、誰も好んで使っているわけではないんだけど、
かといって自分の無能を全てVBAのせいにしている発言を見るとイラッとするのは確か 完全に割り切って ByVal As Object または ByVal As Variant で委譲オンリー 間違えた
ByVal As Object または ByRef As Variant エクセルのマクロちょいちょいと組み立てて自動化させたら
ズルをするな、計算機でちゃんと計算して打ち込め
って怒られた
意味わかんねー パソコンが登場し始めた前世紀になら居ただろうけど、このご時世だと信じがたいわな その手の輩は
1.そんなもんを自動化したら
工数がへるから残業する理由が
なくなるだろ
2.人月商売なのに何で利益減らす行為するん
3.手作り、真心込めて、おもてなし
さて、どれ? >計算機でちゃんと計算して打ち込め
いや〜、そこまで言うなら計算機なんて信じず算盤で計算しろ
が正しいでしょ w 今の時代でも、碌にパソコン使えないくせに、やたらパソコンで作業したがるおじさん・若手はいるし
ああいう人たちが「下手にパソコン使わせると遅くなる」ってイメージを植え付けているのかもしれない
あとマクロ組む工程までいれると、さして時間短縮になっていない人とか 内製にせよ外注するにせよ他人にマクロ作ってもらうとなると時間も経費もかかるし、改修も容易じゃないからな
多少時間かかってもマクロを自分で組めた方が楽なのは間違いないけどね
管理職のくせにマクロの効用を理解できないような奴が、マクロ実装にかかる時間だけを見て手間がかかるからやめろとか言ってくることが結構あるからな 結構あるってことはみんなお前のマクロにはもう懲り懲りなんじゃないの? エクセルマクロだと正しいか間違ってるかの判断が(上司にとって)出来ない
上司が使えないプログラミング言語は禁止ねっていうのと同じ種類の問題だと思うよ マクロは自分用だとすごく便利
他人が作りっぱなしにしたマクロをだましだまし使うのは地獄 エラーハンドリング全然されず
Sheet の初期化(単なるクリア)も
人間がやらないとダメな仕様
のマクロに機能拡張しろってのが
あったけどとりあえず5分で
チンカスであることを強調した上でC#で作り直した思い出 自分だけでこっそり使うんならいざしらず、
他人に使ってもらいたいんなら
使ってもらえるような作り方&ドキュメント整備しろってことだな エクセルは説明書ページを簡単に添付できる(シート追加するだけ)のがいい
EXE形式だとreadme.txtやHELPなんて読んでもらえないしな
まぁ、エクセルで説明ページがあってもよまないやつがおおいから結局コメント機能使いまくりだったり
画面上に説明書いちゃうけど もっぱらpowershellやvbscriptで書いてる
元のワークブック汚さずに済むし >>281
ちなみにどう使い分けしてる?
powershell 使い始めたんだけど思うような動作しなくて、結局vbsでいいやってなっちゃう。 >>281
ちなみにどう使い分けしてる?
powershell 使い始めたんだけど思うような動作しなくて、結局vbsでいいやってなっちゃう。 デバッグ中に別シートに集計中なのに
元データのシートを破壊してしまって涙目
アクティブシートのカレントリージョンをクリアで綺麗サッパリ(´Д`) マクロはおめえのオモチャじゃねえんだよ
これに懲りたらスッパリとマクロから足を洗うんだな マクロは個人のオモチャでいいだろう
性能や信頼性は作り手による >>286
何開き直っとんねんお前もマクロいじるの禁止な 糞マクロでもいいじゃない
だって人間だもの
げいつ >>287
マクロは個人のものだと言っとるだろうが
他人に直接影響を及ぼさないんだから禁止もへったくれもない エクセルVBAのグラフの範囲指定Rows.Countで困っております。
お力添え頂きたくお願いしたいです。
A1からD600まで範囲指定して、K1からK600 までをVBAで範囲指定したいのですが、
なお601行目はすべて空白で、602行目には合計数が入っています。
600行目というのは日によって異なり入力値の最大数がばらばらです。
手動でやる際は A1をターゲットし、Shift →×4、CTRL+SHIFT+↓、
CTRLを押しながらK1をターゲットCTRL+SHIFT+↓で選択。
これをVBAに置き換えるために行ったのですが
某サイトで
Set Target = Union(Range(Range("A1"), Cells(Rows.Count, 4).End(xlUp)), _
Range(Range("K1"), Cells(Rows.Count, 11).End(xlUp)))
というような指定方法がありましたので行ってみましたが
合計数が入力されている602行目が範囲に含まれており困っております。
A1:D600(空白まで),K1:K600(空白まで) というように指定するにはどのようにすればよいでしょか。 >>282-283
>>281じゃないけど俺は新規作成はPowerShellに一本化した
まだちょっとはあ?ってなる挙動があるけどやりたいことはだいたいできてる >>290
Range("a1").CurrentRegion
Range("k1").CurrentRegion
でやってみよう >>290
言い忘れたけど
A〜DとKが表としてつながってない想定ね
一つの表からなら
Range(Range("a1"), Range("d1").End(xlDown))
Range(Range("k1"), Range("k1").End(xlDown))
でそれぞれの範囲をとれる >>293
ありがとうございます。
2つ目に書いていただいた表が一個の場合を想定しています。
Rangeで行う事が出来るのですね。
Cells(Rows.Count, 4).End(xlUp)をxlDwonに
変えてもダメだったのでかなり絶望してました。
A1〜A20とかに書かれている条件でそれが含まれていたら↓を検索するとかも
これでできそうな気がしてきました。
ありがとうございました。 すみません、あまり仕組みがよくわからず
こちらに質問致します。
やり方の案内でも助かります。
Excelかtxtのデータをシート上に配置したボタンワンクリックで
→MySQLにアップデートって出来ますか?
バーコードリーダー等のlogファイル
xls,csv,txt
―――A――――B
1、barcode 棚卸数
2、9876543, 21
3、1234567,89
MySQLデータベース
1、メーカ、型番、コード、品名、在庫数
2、Pansomy,THE123,9876543,USOメモリー,3
3、Hitasun,END987,1234567,モバテリー,7
在庫数を棚卸数で上書きが出来れば良いです。
よろしくお願いいたします。 >>291
なるほど。
VBSはドラッグ&ドロップが使いやすいが終息方向。
VBAは開発しやすいがあくまでオフィスの製品ありき。
pythonは流行ってるが会社のマシンにデフォで入ってない。
導入のしやすさ、汎用性からpowershell かなあ。ただ動作が遅いのが気になるけど アレを使っちゃう派
誤取得する場合があるって聞くけどまだ未経験 『棚卸数の入力作業vba』(Masayo) エクセル Excel [エクセルの学校]
www.excel.studio-kazu.jp
こちらのサイトを参考に
http://www.excel.studio-kazu.jp/kw/20111019173742.html
VBAのマクロをボタン登録で
エクセルのbook 内のsheet2セルからsheet1に書き込む事は出来るのですが、
powershell?が何なのか知りませんがそれで可能ならそれでも良いです。
ボタンを押すとインポートファイルを指定できる物でも良いのですが、
ただ、PhpMyAdminからの操作が素人には難しくてめんどうなので、
ログファイルをドラッグドロップでアップデートかボタン1つでやれないかと思います。
VBSや.hta(html application)でMySQLにアクセスする方法とかでも良いです。
ログファイル名とフォルダが固定ならスケジュール自動化も視野にしたいです。
よろしくお願いいたします。 >>300
ODBCを使うんですか?ありがとうございます。
具体的な使い方がわからないので、ご提示のサイトで勉強したいと思います。
>ySQLコマンドラインツール
マウスかタッチパネル操作のみのおじいちゃんでも出来ますか? >>300
ご紹介頂いたページを見てみました。
誠に申し訳ないのですが
ログのcsvファイルを新規でMySQLのテーブルに入れたい訳ではなく、
ExcelにMySQLからデータをダウンロードしたいのでも有りません。
確かにsheet1にMySQLからのダウンロードは可能です、sheet2にcsvのファイルも準備できます。
そして、先のVBAを用いてsheet2からsheet1の書き換えと消し込みが出来ましたが、
sheet1の書き換え後のデータをMySQLに戻すには
一旦csvで保存して、MySQLのテーブルをdrop かtruncate してから
書き換え保存したcsvをMySQLにインポートするしか無いのでしょうか? >>297
ケースバイケース
空白もカウントしたいかどうかで方法を変える >>297
ケースバイケース
特に他人が作った表にマクロ仕込むときはそう
エクセルスキルがない奴が作るデータは表の配置が本当に酷いから、目で確認しないと意図した通りのセルにアクセスできないことが多い 先生、どうかご指導お願いします。
得意先名が記載してある列に対して
営業所や支店を削除して整理したいと考えてます
下記はAAA梶Z〇営業所という社名、営業署名を
AAA鰍ニ置き換えようとして作成しているマクロです
下記のようにワイルドカードを使って置き換えようとすると
スルーされてしまって変換できません
どうしたらスルーせずに変換できるようになるでしょうか?
Dim Mrow, TOcol, i, t As Long
Dim Mrange As Range
Mrow = Cells(Rows.Count, 1).End(xlUp).Row
TOcol = Rows(1).Find(what:="得意先", lookat:=xlWhole).Column
Range(Cells(2, TOcol), Cells(Mrow, TOcol)).Select
For Each Mrange In Selection
Mrange.Value = Replace(Mrange.Value, "AAA*", "AAA")
Next Mrange Replaceにワイルドカードに対応した機能なんてあったっけ? >>305
素直に置換窓でしたら?
って愚問かしら >>305
Mrange.Value = Split(Mrange.Value, "")(0) & "" これマクロでやる必要あるのかな、関数でやる方が早くて楽だと思うけど。 どうもありがとうございました!
関数使ってしまうと私しか操作ができないので
CSVで読み込んだらボタン一つで誰でも結果が出せるようにしたかったのです^^
どもありがとうございました! この程度の動作でわざわざマクロ組んでボタン付けるのって無駄な気がするけど。
実際は複雑な条件分岐でもあるのかな。
大量にcsvがあるなら、一人で一括処理した方が早いし。
複数人で手分けするにしてもこれアドインで配るのか。
イマイチ作業がピンとこないな。 業務アプリからCSV吐き出してExcelでインポートする定型業務なんだろ >>305
Mrange.Replace what:="AAA*", replacement:="AAA" >>316
そういう感じか。
自分なら作業フォルダ決めて、そこに突っ込んだファイルでループ回して一括処理するな。
配布するならVBSでドロップしたら処理するようにしとく。
とりあえずボタンなどつけず、不可視でやった方が効率いいと思うな。 終わった問題にくどくど文句言ってんじゃねえよバカw あるURLからsendkeysでctrl+a ,ctrl +cで全画面をコピーし、セルに貼り付けたいのですが、macなのでIEが使えず、困っています。
どなたかわかる方いらっしゃいますか?? 社内で使ってるソフトがVB6で動いてるんだけど、見直すことになって中身見てるんだけど変数宣言してなかったり変数名なのかコントロールなのか分からんしGOtoで飛びまくってあっちゃこっちゃ移動して見辛いのをキレイに直す近道は何かね? >>321
一度に一つのポイントに絞って直していくといいよ。
たとえば、コントロール名の命名規則を全体的に統一、
動作確認、変数宣言強制、動作確認、
GoToを排除(関数切り出しやループ構文)、動作確認、
で、機能・動作は同じままで中身が綺麗になったら
C#やらPythonやらに移植するのもいいかもね。 >>324
やっぱそういうかんじですよね。ゆくゆくC♯にはするつもりです。 >>328
″¥工(任意の文字列).(任意の文字列)″
って感じ? >>321
goto文を切り離して呼び出して使おう ExcelVBAパスワード解析(解除)が出来ないプロテクトをかける方法がないかな。
※解除出来るVBAが出回ってる、、、。
ソースを見せろと上司から言われて困っています、、、。 業務として作ったものであれば上司の指示に従うべきかと >>325
その質問をここにするような馬鹿頭じゃ無理なんじゃ? >>332
改善したことがすべて上司のおかげになってる。
上司のことを神様の存在?かな、、、。
わかりました。
ありがとうございました。
クソ会社を辞めてくる。 >>321
まずは全てのコードの先頭にOption Explicitを入れて変数宣言をきちんとするところからかな 初心者って必ず>>336言うよなw
誰に騙されとんのお前ら?w 変数宣言をし忘れることはなくてもtypoのリスクはなくならないからな。 Visual Studioにコピペして修正すると捗る
typoとかもチェックしてくれるし typoってそこまで問題になるかな。
マクロを大きな塊で作るとか、途中でテストしないとかじゃないと問題になるような発生の仕方しないと思うんだけど。 変数名ミスあるある
使ったことない関数と偶然同じ名前
よく似た変数をいくつも宣言してて、間違えたのにエラーにならない
逆に関数名をタイプミスして変数と解釈される >>341
大して問題にはならないと思うけど、多少は時間を浪費してしまうんじゃないか? >>331
業務で作成したソースコードを隠すとか何考えてるの??? お昼休みや定時後サービス残業やプライベート潰して土日に頑張って作ったマクロだから他人に無償で差し出せと言われたら躊躇なく消し去る >>345
じゃあ最初から作ったとか言わずに誰にもバレないようにこっそり使っとけ
頭のおかしな部下を持つ上司に同情するわ VBAというプログラミング言語は、昔からある枯れた技術だけど
エクセルを使っていない職場は、無いと言えるぐらい普及しているから
業務のAI化の流れから需要が減る可能性は少ないだろうなあ >>348
エクセルよりお前の需要の心配しろよ能天気さんw パソコンによって紙が減るって言われていたのに印刷物が増えたように、
AI化するとカバー出来る業務が増えた結果、逆に忙しくなりそう。 パソコンによって誰でも気軽に印刷物を作成できるようになった
だから紙の書類は増えたんだけど
それ以上に母数となる書類は増えてるんだよ
印刷されてない電子書類の数も含めたら、やっぱり紙の書類の割合は減ってる Excel2013
デザインモードってONでもOFFでもどこが変わったのかわからないんだけど、
何が違うんですか?
検索したら、OFFの時はオブジェクトを右クリックしてもコード編集ができないとか書いてあって、
そんなことないんだけど! >>355
いいか、よく聞けよ
世の中には2種類のオブジェクトがあるんだ
フォームコントロールと、ActiveXコントロールだ >>356
知ってる。ActiveXコントロールの方は一切使わないんだよね。 UserFormのオプションボタンが2つ(AとB)あったとします。
あるFrameのvisibleをFalseにしておいて、Bが選択された時だけTrueにしたいのですが、
@Bを選択→Frameが表示される
AAを選択
BBの選択は解除されるが、Frameが表示されたまま
になってしまいました。
Bの選択が解除されるのを認識させるにはどうしたらよいでしょうか? Bが選択された時だけTrueにしたのなら
つぎは
Aが選択された時にバルスにしたらいいんじゃないかい? >>359
ありがとうございます。
ボタンは今後増やす予定で、
たとえば、ボタンCを追加した場合は、
A_Clickと同様にC_ClickにもBのバルスを追加する必要がありますよね。
ボタンを追加する度に同じ処理を入れるのはイマイチかと思いましたが、
このぐらいの1行で済む処理なら問題なしおですかね。 >>275
やめろー
言うんじゃない、言うなー
作らせておいてちょっとミスると「こんなんだったら手作業でも一緒だよね」とかぬかしやがって。
朝まで電卓叩いて俺徹夜しましたオレ頑張ってますアピールしてろハゲ Option Explicit
Private Sub OptionButton1_Change()
Frame1.Visible = OptionButton1
End Sub
Private Sub UserForm_Initialize()
Frame1.Visible = OptionButton1
End Sub >>360
お、悪くない着眼点だねー。
都度分岐を増やすと手の入ったところは全て再テストし直しになるし
その分岐がいろんなところに発生したら結構大変だよね。
いくつか方法があるよ。
例えば処理名とTRUE、FALSEの状態をシートに記載しておいて
処理に該当する状態を取得して設定する方法。
そういうことの出来る関数を一つ作っておいて
後は処理名を引数にでも渡して状態を取得するようにすれば都度分岐が増えることは無い。
他にもボタンが増えるということは
何かしら新しい処理が増えると言うことだから
新しく増えた側の処理に状態を持たせたりとか。
まぁ、その辺のことは前にも同じようなレスがあったと思ったけど
そういうのを組み入れるのと長期的に見てそこまでのものでは無いんじゃ、と言うのが
組み入れるかどうかの判断基準になるんじゃないかな。 >>364
ありがとうございます。
プログラムを考えるのが面白くなってきました。 データのある最終行を取得したいのですが、
うまくうごきません。
Range("A10", Cells(Rows.Count, 1)).End(xlUp).Select
A10から下に続く最後の行数(データ個数15個、空白なし)を取得したいのですが、
なぜか返ってくる数は24ではなく、
1048575です。
知識が浅く、解決できません。
どなたかご助言お願いします。 Range("A10").End(xlDown).Select >>368
余計なものがあったんですね。
ありがとうございます。
少し進みました。 シート1〜10まであって、a+b=cって計算を、シート1〜7で行ってます
aとbは入力シートに入力した数値で、各シートが、個別に入力シートから引っ張ってきています
各シートで同じ変数を元に同じ計算をしてるが作り方って変ですかね?
なんでそんなことしてるの?というと、検討するシートを1つ作って、そのあと別検討シートを追加、という作り方をしていった結果、検討内容自体は違うものの、共通の計算があるっていう状態になっていて、特に意識したわけではないです
このエクセルを整理することを考えた時、共通の計算は、別個シートを作って、そこで計算させておくべきでしょうか?? UserFormの部品の位置を微調整するために、
ズーム表示させる方法はありませんか?
(今は、Windows標準の拡大鏡を使ったりしています) スペースがあるかないかもわからん馬鹿がなぜそんなことを気にするかね >>371
>>371
あっvbaスレに間違えて書き込んでしまいました
すみませんvba使いません UserFormを作成中にF5押下でお試し実行ができますが、
普通にやるとモーダルになります。
F5押下でもモードレスで実行する方法ってありますか? >>376
UserFormのShowModalプロパティをFalseにする ここはレベル高ぇ。
でも、みんな、協力しているのはとても嬉しいです。
勉強になる。
ありがとうございます。 よろしくお願いします。年1のプレイヤーです。
商品コード(1000〜1000000)に対して、別シートにある原価を
vlookupで検索し、商品コードの右セルに代入しようとしているのですが
1000番台はエラーにならず、200000台からエラーになってしまいます
(1000番台の次は200000台にコードが飛びます)
「worksheetfunctionクラスのVlookupプロパティを取得できません」
なにが原因かわからなくてヘルプお願いします。
=================================================
For i = 2 To 最終行
原価 = 0
With Sheets("原価")
原価 = WorksheetFunction.VLookup(Cells(i, 商品コード列), .Range(.Cells(1, 1), .Cells(10, 1000)), 6, False)
End With
Next i IEやExcelを非アクティブのままバッチ処理してると、CPUやメモリをやたら消費するのはなんでだろ?
AppActivateで対処はできてるけど、理由が分からないのが気持ち悪い
(ちなみにAppActivateは自アプリを前面にできないのはなんでだろ?いちいち別のVBSを呼び出してる)
Excelが「遅くなる」点については調べてる人がいて、「非アクティブでは遠慮して動くから」と
CPUが櫛型に動いてる様子を紹介してた
ならCPU使用率が下がるはずなのに現実は逆で、やたら使用率が上がり、メモリも何倍も上がる
遅い分イベントが貯まってスタックが貯まってメモリが上がって、そのためにCPUも上がるのかな
「遠慮する」機構が裏目に出てるのかな IE, Excel などのプロセスを終了していないとか?
ドンドン起動しても終了しないから、プロセスが無限に増えていってるとか?
タスクマネージャーで見れば? >>387
1プロセスの話
それに、プロセスが貯まってる話ならなんでAppActivateで解決するのん? 例えば、コマンドプロンプトから、Ruby を起動して、そのソースコードから、
Selenium WebDriver で、ブラウザを起動すると、
これらは、GUI のプロセスだから、プロセスに親子関係がある。
(親) コマンドプロンプト → Ruby (子) → ブラウザ (孫)
だから、親か子を終了すると、孫のブラウザも終了する
でも、VBScript(VBS) などで、CUI モードを使うと、親子関係を断ち切るから、
(親) VBS → ブラウザ・Excel (子)
VBS を終了しても、ブラウザ・Excel は終了されない。
子プロセスを、自分で管理せず、OS に任せている状態になる >>390
あ、分かった、俺が悪かった
タスクスケジューラで直接エクセルを起動した場合は、この現象起きなかった気がする
DOSのバッチ経由で起動すると起きる気がする
で、「OSに任せる」と、非アクティブ時に無駄にCPUとメモリを食うと
なるほど
留意点は分かったけど、理屈は分からんw プロセスには、2種類ある
ユーザーが管理している、画面を持つ(GUI)プロセスと、
OS が管理している、画面を持たない(CUI)、
バックグラウンドで動作する、サーバーのようなプロセス
上は、プロセスに親子関係があるけど、
下は、OS がプロセスの親になるとか? フォルダ内の複数のエクセルファイルを開いて指定シートをコピーして閉じるを繰り返したい。コピーするシートは各エクセルに対して1シートのみ。
シート名は個人名でそれぞれバラバラなんだけどいい方法ない? >>394
人が開いたときにそのシートを特定するときはどうしてんの?
それをプログラムに落とせばいい 質問です。
whatif のデータテーブルで、sheet1にある式をsheet2から参照したいのですが、「代入セルの参照が正しくありません。」というエラーが出ます。
sheet1の同じシート内でやる時はエラーは出ないのですが、別シートは参照出来ないのでしょうか。 >>397
はい。
対象のシートをアクティブにして下さい、 入力規則でセルに選択リストを作りました
で、セルのプルダウンで選んだアイテムが
何行目か?っていうのを知りたいんだけれど
doとかfor文でリスト先頭から一致検索するしかないのかな?
一発でアイテムのカウント何件目か取得する事って出来たりするんかなぁ? >>394なんだが、フォルダ内のエクセルをループして開いて、目的のシートのオブジェクト名を統一してファイル開いてオブジェクト名をfor eachでヒットさせて、functionでそのシートをテキストにしたいんだがどうすればいい?ループさせてヒットさせるまではできた。
結果txtファイルは同フォルダ内の1個あってそれに更新して書き込んで行きたいんだが。
誰か教えて下さい。 csvにエクスポートでもすればいいよ
マクロの記録でコード作れば >>404だけどネットで探しながら作ってみてできたんだけど、
一回目のエクセルブックの指定したシートをoutputでテキストファイルに書き込み。2回目以降をApend?だっけ?で続きに書き込んでいくんだけど、outputとApend の違いだけで書き込みコードが2つあるのを一つにまとめるにはどうしたら出来ますか? >>409
Append でやれば
ファイルがないときは勝手に作ってくれるよ >>409
フラグ格納用の変数(初期値False)をFor文の外側で定義して
変数がFalseだったら初回用の処理をしてTrueを代入して
変数がTrueだったら2回目以降の処理をすればいい 質問です
今EXCELで対戦格闘ゲームを作っているのですが
キャラクター同士の当たり判定は
それぞれ攻撃用、体用と別々に持つことで
正しく動いています。
ただ攻撃が当たった時のヒットマークを表示する位置を
どのように算出すれば良いかが思いつきません。
何か良い方法はないでしょうか?
ちなみにキャラクターはシートのセルを方眼紙のように見立てて
横256*縦200で1セルを1ドットに見立てて行っています。 言い忘れていましたが
当たり判定は各キャラクターの動作毎、絵柄毎に
攻撃用が1〜3個、体用が1〜5個の四角い範囲を持っていて
それが重なったかどうかで判定を行なっています。
動作とは例えば小パンチとか、大パンチとかを指します。
同じ絵柄でも違う動作の場合は
違う範囲で当たり判定を行えるようにしています。 >>412
スレ違い
ゲームデザインとかアルゴリズムの類であってVBAの質問ではないと思う >>414
多分そう一蹴されて終わるかもとは思っていました。
興味がある方は返答頂けると有り難いです。 >>415
思っていた??
なら最初にそう書けよ
スレ違いの上に後出しじゃんけん
一番嫌われるパターン
要約すると「死ね」 >>415
「ゲームプログラミングなら俺に聞け」とか、そういうスレの方が絶対いいと思う ヒットマークとやらをどう表示したいのかも書いてない
こんなんで回答がつくわけない
質問の体を装ったただの俺こんなの作ってるスゲーだろアピール 当たり判定とヒットマークの位置関係だけあらかじめ決めておいて、あとはヒットした当たり判定のセル位置のアドレスなり座標なりからオフセット参照するだけじゃん >>420
構うなや
どうせまた後出しで「その方法も考えたんですが
〜〜が〜〜だからそれではダメなんです。」とか
慇懃無礼にマウント取ってくるから マウントって簡単に言いすぎ
倫理をふりかざして人を委縮させようとする言動に限らないと
言葉の力がなくなってしまう >>412
もしかして当たった位置が判らないということですか? >>412
へぇ、このスレでは珍しい質問だね。
あくまでひとつの方法としての提案だけど、
当たり判定が出来るということは攻撃範囲と体範囲って呼んでるけど、
それが重なったことは判定出来てるんだよね?
なら重なった範囲の中心にヒットマークを出すようにすればいいと思うよ。
つまりキャラAの右下セルよりキャラBの左上セルが
左上にあって、かつ
キャラAの左上セルよりキャラBの右下セルが右下にある場合、これがキャラが重なった「当たった」ことに該当するんだけど、
この状態からキャラAの右下セルからキャラBの左上セルの縦横それぞれの差分を出して
それを2で割ってキャラAの右下セルの縦と横にそれぞれ足してやれば求められるはず。
後は複数判定用の範囲を持ってるというところで
どの範囲を優先するかの優先順位をつけて。
頑張って下さいね。 教えてください。
別ブックを範囲(A10:B24)指定してコピーして
現在のブックA10をはじめとした範囲にペーストしたいのですが、
なぜか参照ブックをアクティブにした上で範囲指定ができません。
最初のブック・・・A.xlsm
参照ブック・・・nal.xls 参照シート:sheet10
参照ブックのデータ最終行・・・i (24が入っています)
Dim i As Integer
Workbooks("nal.xls").Activate
i = Worksheets("sheet10").Range("A10").End(xlDown).Row
Workbooks("nal.xls").Activate
Worksheets("sheet10").Activate
Range(Cells(10, 1), Cells(i, 2)).Select ←RangeクラスのSelectメソッドが失敗しました。
Selection.Copy
どなたか助けてください。 複数シートでゴニョゴニョする際は
Worksheets("sheet10").Range(Worksheets("sheet10").Cells(10, 1), Worksheets("sheet10").Cells(i, 2)).Select
と略さずに書くといいよ
デバッグ中につい違うページ開いちゃうと後で泣きを見る Aブックに、BブックをOpenするコードが書いてあります。
困ったことにBブックが正常に開くこともあれば、
長時間たってもビジー状態が続き開かないこともあります。
これはAブックから開くときだけでなく、Bブックのアイコンをダブルクリックしても同様です。
そんなときでも、エクセルを強制終了した後にBブックを開くとなぜか問題なく開くことも多いです。
Bブックの問題を取り除くのが正しい方法なんでしょうが、とりあえずの対策として、
wb = Workbooks.Open(strPath & "\" & "B.xslm")
で、AブックがBブックをOpenした後に一定時間経過後にBブックの特定のセルの内容を読み取れなければ、
Bブックを強制的に閉じて、再度Bブックを開き直すというコードを書こうと思ったのですが、
wb = Workbooks.Open(strPath & "\" & "B.xslm") を実行すると、
Bブックが開くまでAブックのマクロが止まってしまい、Bブックのセルが読めるかどうか判定することができません。
どうしたらよいでしょうか? >>429
開けていないものを閉じろと言うのは無理ゲー 最初にタスクマネージャーで、
起動中のすべてのExcel を、強制終了させてから実行すれば?
たぶん、起動中のExcel が、そのブックをつかんでいるのだろう 皆さん色々返答ありがとうございます。
>>420さんと>>425さんの意見を
参考にさせて頂きました。
特に>>425さんの案は取り入れてみたところ
範囲が大きいときでも小さいときでも
見た目いい位置に表示されしかも汎用的に
使えるようでありがたいです。
>>420さんの案は乱舞系必殺技のような
受けた相手の位置を補正しながら出す技に最適のようです。
ちょっと行き詰まったところだったので
非常に助かりました。ありがとうございました。 >>432
VBA初心者でこのスレをたまにチラチラ見ているものですが
「EXCELで対戦格闘ゲーム」ってものがどういうものなのか全然想像できないです
(どうやったらそんなことできるの! てかどんな画面になるの!! 状態です)
もしよろしければ、何か雰囲気の掴めそうな画像か
もしくは、そういう人たちが作ったゲームのリンクなどを紹介していただけると嬉しいです >>428
お返事遅くなってすみません。
コード丸写しで略さずにかいたところ、うまく動きました。
エラーの前のbookとsheetをアクティブにしただけでは足りなかったようで。
勉強になりました。
ありがとうございました。 >>433
ちと古いけどこういうのがある
Excel VBA アクションゲーム作成入門 Excel 2007/2003/2002 対応
https://book.impress.co.jp/books/2686 >>437
紹介ありがとうだけど…、本だとやっぱりよく実感がつかめない…
でその本のタイトルで色々ググってみたら実際にゲームをやってる動画が出てきた
エクセルでスーパーマリオを作ってみた
http://www.nico video.jp/watch/sm12052293
Excelでこんなものが作れちゃうってすごい!(というか見てもなお信じられないが) >>438
お前みたいな馬鹿には無理ってだけ
dll呼び出しできるから何でもやろうと思えばできる スーパーマリオのDLLとかあるんか?
すげーなエクセルって >>440
DLLは自分でいくらでも作れるし、スーパーマリオもDLL化は可能だけど普通はそんなバカなことはやらない >>439
バカはお前
DLLなんていくら出来たところでゲーム作れるだけの知識がなければ何も出来ない
知ったかぶりしてないで死んどけゴミ >>442
作れる知識と作る意義を感じるかは別問題
馬鹿は死ねよ メゾット野郎はいつも口先ばかりwwwwwwww
違うってんならゲーム作ってみせろ無能wwwwwwwwwww やろうと思えばできるって言ってもなあ
やってない人が言ってもみたいな マリオのゲームってもコントロールしてるわけじゃないでしょ?
ドットに色表示してるだけじゃないの? >>439
DLL使うんならExcelでやる意味なさそうだがな
Excelのセルでドット絵を描いてVBAでアクションゲームを作るということに
Excelでアクションゲームを作る意義があるんだと思うが >>449
> マリオのゲームってもコントロールしてるわけじゃないでしょ?
> ドットに色表示してるだけじゃないの?
本まである(>>437)のに何言ってるんだろう… >>452
同じフォルダに置いておけば使えるだろw 質問です。
任意のフォルダ(ThisBookと同じフォルダ)の中にある
xlsファイルの数を取得する方法を考えています。
Dim N as Integer
With CreateObject("Scripting.FileSystemObject")
For Each ff In .GetFolder(ThisWorkbook.Path).Files
If UCase(.GetExtensionName(ff.Path)) = "xls" Then N = N + 1
Next
End With
ネットで調べてみたものの、カウントがされません。
現在対象のフォルダにはxlsファイルが一つあります。
どこを修正すれば良いのでしょうか。
教えてください。 >>456
UCaseの意味をもう一度調べてみれば? Ruby なら、これだけだが
puts Dir.glob('*.txt').size #=> 5 >>457
調べました。
UCaseではなく、LCaseだったんですね。
先に進めました。
ありがとうございました。 >>459
UCase/LCase よりも
StrConv(, vbUpperCase) や StrConv(, vbLowerCase)
を使った方がより良いと思う。
なんとなくだが 寧ろ、with はああいう使い方をすべきなんじゃないの。単なる記述の省略としてだけでなく。 いんや、.NetのUsingみたいに解放は確実に出来るけど
ひとつのスコープにひとつしか使えないし
コーディングに慣れてる人には
一瞬、どこで生成してるの?ってなるから
可読性の見地からイマイチかなと思う withってusingみたいに解放してくれるんだ
Set使うより簡潔にできるのね >>464
> コーディングに慣れてる人には
> 一瞬、どこで生成してるの?ってなるから
普通にインデントしてたらそんなことにならん
> 可読性の見地からイマイチかなと思う
お前だけだろ こんなもんコピペグラマーでもしょっちゅう目にしてるはず
この程度でわかりにくいとか、どんだけ素人だ
ただ、老眼の俺にはドットの見落とし、書き漏らしがちょっと怖い >>466
自分も初めて知った。
けどネスト深くなると、破棄されたか分かりにくそうではある。
オブジェクト残ってると問題出るプログラムの場合はちょっと使うの怖いな >>466
withでcloseはしないんじゃないの?
あくまでusingぽくて分かりやすいというだけで。 >>470
自作クラスに Sub Class_Terminate() を定義してステップ実行してみればわかる。
End With 後にちゃんと呼び出されるから。 無知なのは仕方がないとしてもEnd Withの後にClass_Terminateが呼び出されるのなら
論理的な帰結としてWithがオブジェクトの解放をしているのではないと気がついて欲しかったなあ それに「無知」とは何のことかな?
非明示的にデストラクトされてもFreeはされない言語があってその事を知らない、という意味かな?
だとしたら知らない >>467
>>468
同じ階層に同じようなObjectがある場合、
Withを使ってる奴だけそんな方法で解放するの?
統一性のないコーディングだなぁ 解放の方法が違う程度の事を気にしてたら現場で発狂しまくりだろうなぁ スタイルは大事だから気にするわな。
気にしない奴はバグ増えまくりだ。
現場が忙しくなると崩れて来る。
そして俺のバグも増えるというわけさ。
気にしない奴とは仕事したくないな。 プログラマってどういう大学のでの人たちがやってるんだ?
あんま高学歴のイメージ湧かないんだけど Withをネストして内側から外側を参照するにはどうすればいいの?
最悪それ自身のオブジェクトを変数に保持できればいいけどできないよね?
>>456を例にとると(この場合ネストするメリットは何もないけど)
Dim N As Integer
With CreateObject("Scripting.FileSystemObject")
Dim obj As Object
Set obj = .
With .GetFolder(ThisWorkbook.Path)
For Each ff In .Files
If LCase(obj.GetExtensionName(ff.Path)) = "xls" Then N = N + 1
Next
End With
End With
とか
Dim N As Integer
With CreateObject("Scripting.FileSystemObject")
With .GetFolder(ThisWorkbook.Path)
For Each ff In .Files
If LCase(..GetExtensionName(ff.Path)) = "xls" Then N = N + 1
Next
End With
End With
とか スマソが、結局>>456のコードにおいて、fileSystemObjectはEnd withのタイミングでfreeされるってことでok?
で、With OpenTextFile()とした場合も同様にcloseされる理解でok? >>480
ヘルプにネストすんなボケカスと書いてあったような。
未確認発言失礼。MS-Officeが無いもので。 >>481
With New ObjectX
.Exec
End With
は、
Dim obj As ObjectX
Set obj = New ObjectX
obj.Exec
Set obj = Nothing
と同等という理解
根拠となる文献は↓の人が挙げてくれるはず つまりNothingを代入してもオブジェクトが解放されないのと同様にEnd Withでオブジェクトは解放されない
たまたまそこでオブジェクトの参照カウントが0になったから解放されただけ > freeされる
という表現が悪かったか。
Nothing代入と等価ならそれでええです。いずれにせよその類の機能はwithに無いと思っていたので。
ありがとう。 >>484
うん?.Net系と勘違いしてない?
.Net系は確かに参照しているところが無くなればガベージコレクションで解放するけど
VBAや旧VBであるVB6はNothingを入れるとそのObjectそのものが解放される仕組みだと思ったけど 参考までに
With New ObjectX
.Exec
End With
→End Withで解放される
With New ObjectY
.Exec
GoTo Line1
End With
Line1:
→解放されない(関数の最後で解放)
GoTo Line2
With New ObjectZ
Line2:
.Exec
End With
→生成されない(.Execで実行時エラー) >>486
仮にClass1で以下のプロパティが定義されているとすると
Public Property Get Self() As Class1
Set Self = Me
End Property
以下のWithで生成されたオブジェクトはEnd Withで解放されない
Dim obj As Class1
With New Class1
Set obj = .Self
End With >>475
そういう場合は使わなきゃいいだけ
応用力ないの? >>490
そういうのは応用とは言わない
一貫性が無いと言う >>491
一貫性の話はコードの話
応用力はお前自身の話
まあそう言うことも理解できてないバカなのはわかった w 俺はオブジェクトにNothingを入れるのを諦めた
プロシージャの途中で条件によりExit Subする時とかまでカバーしようとすると
コードが変な方向にねじ曲がっていく >>489
何を勘違いしているのか知らんが、Nothingを入れても参照が残っている限り解放はされない
>>488のClass1の定義で、
Dim obj As Class1
Dim obj_ref As Class1
Set obj = New Class1
Set obj_ref = obj.Self
Set obj = Nothing
→「New Class1」で生成したオブジェクトは解放されない(参照が残っているから) >>486
未だにNothing代入の誤解が蔓延っているんだな
旧VBプログラマーの無知が作りだした因習が新参のマクロプログラマーに受け継がれるっていう
もはやウイルスの如き感染力 >>497
それはFormにあると言うだけで全てのオブジェクトにあるわけじゃない
>>480みたいにネストしてあれこれやりたいなら素直に変数にSetした方がいい 「ネストしているときはWithを使えないからネストしないときもWithはやめよう」
↑
これを「一貫性」と呼ぶのか?流石にそういう主張じゃないよな。 ExcelがPythonをネイティブサポートしたら世界はどう変わるか。 応用力とは言わないんじゃないの
その場しのぎの対応は、一貫性がないんだよ >>480の汎用的な解ができたよー
【標準モジュール】
Public Function ObjectWrapper(ByRef ObjectRef As Object, Optional ByRef ParentWrapper As ObjectWrapperClass = Nothing) As ObjectWrapperClass
Dim wrapper As ObjectWrapperClass
Set wrapper = New ObjectWrapperClass
Set wrapper.Ref = ObjectRef
Set wrapper.Parent = ParentWrapper
Set ObjectWrapper = wrapper
End Function
【クラスモジュール : ObjectWrapperClass】
Private m_ref As Object
Private m_parent As ObjectWrapperClass
Public Property Set Ref(ByRef ObjectRef As Object)
Set m_ref = ObjectRef
End Property
Public Property Get Ref() As Object
Set Ref = m_ref
End Property
Public Property Set Parent(ByRef ObjectWrapper As ObjectWrapperClass)
Set m_parent = ObjectWrapper
End Property
Public Property Get Parent() As ObjectWrapperClass
Set Parent = m_parent
End Property
Public Property Get Self() As Object
Set Self = Me
End Property >>507の使用例
With ObjectWrapper(CreateObject("Scripting.FileSystemObject"))
With ObjectWrapper(.Ref.GetFolder(ThisWorkbook.Path), .Self)
For Each ff In .Ref.Files
If LCase(.Parent.Ref.GetExtensionName(ff.Path)) = "xls" Then N = N + 1
Next
End With
End With 1点質問です。
ODBC接続するマイクロソフトクエリ(xxxx.dqy)をエクセルVBA(EXCEL2010)から起動する際、
ユーザとパスワードを自動入力してログインするマクロを作成したいのですが、
どのように記載すればいいでしょうか。詳しい方、ご教示下さい。
宜しくお願い致します。
sub mac()
Workbooks.Open ("C:\TEMP\xxxx.dqy")
'/// ユーザ(abc)、パスワード(p1a#s%s)自動入力
end sub >>504
どっかのサイトからポトペタして貼り付けたのが動きませんけどって
阿鼻叫喚の地獄絵図 勉強して会社エクセルに入れたいんだけどセキュリティ的にどうなのでしょうか?
管理者権限がなくてもできますか? >>513
セキュリティ的には完全にアウトだから入れたかったら会社の上司に相談すること >>513
今の時代にエクセルが入ってない職場ってどういうところなんか気になるな 日本は中小企業が大部分を占めるのでExcelの需要が大きいんだと思う。 10年以上受け継がれてる見積もりシートとかあるわ。 >>520
雇用者数に対する中小企業割合は日本では8割、アメリカ、イギリス、ドイツなどで5割程度のようだが、これおそらく生産性に直結してると思う。
資本が集中していない分、日本は競争力が低い。
一方で、中小企業割合が大きいということは、一国一城の主となれる割合が大きいことでもあり、儲からないけど好きなことで飯が食えるという意味では良いことなのかもしれない。 ちなみに欧米でも中小企業が8割を占める国があり、イタリアがそうらしいです。
イタリアは職人的な工芸製品のイメージがあり、製品本来の価値よりブランドイメージが先行している感じがする。
そこは見習うべき点かもしれない。
同じものを売るなら高く売ったほうが良いからね。 中小とか関係無いだろ。
大企業でExcel入ってない所なんて聞いたこと無いぞ。 大企業はエクセルの他にTableauとかSAPとかSalesforceみたいなの入れてたりするやん
大抵の中小にはエクセルしかない >>525
入っててもExcel使ってるだろ。
それも、そういうのより有用にな。
お前が言ってるのはプラスアルファの部分で必須という点ではExcelの方が上だぞ。 Excelのほかにはちゃんとしたデータベースが導入されていれば
事務部門には必要にして十分だろう Excelの最大の問題点は情報の共有。
日本の大企業がExcelに頼っているならそれが弱点かもしれない。 >>528
働いたこともないニートが妄想で語るなよ 情報の共有ってことだと社内データベースが不可欠だけど素人では運用するのが難しい。
このネックはなかなか解消できないのかもね。
開発ツールとかはただでいくらでも手に入るし運用も問題にならない。
ルールで導入できないとかそういうのは自業自得だから。 >>528
Excelの共有機能を使えば万事解決やろ >>531
無駄だろな。
俺は階層ディレクトリにも疑問を持っているのだが、おそらく理解する人は少ないだろうなあ。
一番被害を被ってるはずのウェブ屋さんが「階層ディレクトリは素晴らしい」と言い張りそうな気がする。 業務用のパッケージソフトってだいたい300万位がエントリーレベルなので、そうおいそれと買い換えられない。
ここもネックになってる。 ただで手に入るSQLSever ExpressとVisual Studio Express で機能的には十分なんだけどね。
運用が難しいってだけじゃなくて、「ツールを導入するのが好きな人」の陰謀なんじゃないかと勘ぐっているw 業務用ソフトってのはサポート込みなんだけど
どこの企業でも運良くパソコンオタクが入社して時間を持て余してるわけじゃないんで
データのバックアップから非常用の電源まで、まとめて面倒を見るのは大変だし、いちいち調べて対処するのは効率が悪い
ノウハウを持った会社からパッケージで買った方がずっとコストも安いし対応も早いし安心できる VBEのコードウインドウの背景色を濃いグレーに変えたのですが、プロシージャの区分線の色も濃いグレーのために背景と同化して見えなくなってしまいました
プロシージャの区分線の色を変更する方法ってありませんか? >>535
業務ソフトじゃなくてツールの話をしてるんだけど?
定型業務以外の、何か調べてレポートしたりとかマーケティング向けの調査とかそういうの。 300万の製品を10年使われると年間30万、月2万5千円だろ。
だったら月2万5千円で最新バージョンが使い続けられるといいのだがな。
アップデートが途中で打ち切られるので未だにXPがあるんだよな。
XPで何でもできるならそれでもいいんだが、新しいソフトはXPサポートしないしな。
300万は微妙すぎる金額だよな。
まあ微妙だからこそ、その価格に集中するんだろうけど。 代々受け継がれてるExcelのシートも結構あって、そこで問題になってるのが情報の共有なんだよな。 小はともかく中規模の事業所はデータの整理も進んできてる
古いデータを必要な物からデータベースに落とし込んで再利用可能にしてる
それをやらないと競争に勝てないんで むしろ小規模ならクラウド上に乗っけて
GITとかで管理すればいいんじゃないの? REST APIをコールしたいんだがVBAだとどんな選択肢がある?
IEインスタンス使う方法以外で >>525
その辺のパッケージにマトモなBI作ってない企業は出力したデータをExcelで加工する仕事がある ID:OGHJWfFq の頭の中では…
なぜ私が質問したのにみんなスルーしてるの!
私が質問したら答えるのが当然でしょ!
答えるのが当然なのに答えないってことは、つまり知らないって事よね!?
↓output
>>544 誰もわかんないですか? >>542
RESTのことを知らないのであれだけど
httpリクエスト(getとかpost)する方法のこと? >>542
Application.WorksheetFunction.WebService() >>545
いえ、わかんないの?って感じで煽ったらそれぐらい知ってるわ!ってノリで答えてくれる人が出てくるかなと思いまして お前ら関係ない事まで答えたがるくせにw
何変ないじり方してんだよw Dim c As Byte
For c = 1 To 43
処理
Next c
For c = 43 To 1 Step -1
ここでオーバーフローのエラーになります。cの中身は44でByteの範囲内です。
エラーになる原因を教えてください。 c = -1
でもオーバーフロー
Byte型にマイナスがだめ -1でオーバーフローするってのは判る。それに今どき積極的にByte型を
使う理由もそうないだろうって事も。
だけど>>550でオーバーフローになる理由が判らない。
>>550ではループ終了時にも値はマイナスにはなってないよね? ぐぐってみたら10年以上前からなんやねんこれってなってる
ttps://www.ozgrid.com/forum/forum/help-forums/excel-general/66761-overflow-error-in-for-loop-stepping-backwards-with-byte >>557
ありがと。まぁループ変数にByte型を使うなって事で ┐(´д`)┌ヤレヤレ For文の内部処理で-1をバイト型にキャストしようとして詰んでしまってるんじゃなかろうか Step -1 の-1をDim c As Byte のByte型に合わせようとしたけど、Byte型では
範囲外 オーバーフローだぞ…と
なるほど Variaant型変数を宣言して整数を代入した場合
Dim i
i = 65535
i = i + 1
して65536にしてもオーバーフローエラーにはなりませんでした。
Variant型変数の整数の内部表現はLongが標準なんでしょうか? >>561
いっぺんヘルプ読んでみ
ttps://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/variant-data-type 急にオートメーションエラーが発生するようになったんだが。。。 ググったところ
以下のリンク見て、動くようにはなったが、納得できない感じ
ttps://social.msdn.microsoft.com/Forums/ja-JP/1522c74b-17e7-402d-8a87-2d1a6af1feab/excel-2016?forum=vbajp
Windows Update で動かなくなるとか勘弁 listviewで教えてください
幅を自動調整したい時、ぐぐると「widthプロパティを-1か-2にすべし」と書いてあるのですが、
やってみると「プロパティの値が不正です」とエラーになります。
フォームエディタのプロパティ画面でwidthを直接設定しようとしたら、そもそも「0以上の値を
入力してください」と言われてしまいました。
listviewの仕様が変わるか何かあったのでしょうか。
それとも、実は同名の別のコントロールなのでしょうか。
listview事態は、ツールボックスを右クリックしてその他のコントロールから
Microsoft ListView Control, version 6.0
というのを有効にしています こんなに詳しいならVBAなんかじゃなくてドットNETに移行したら?
出来る範囲も桁違いに多いし技術的にはVBAとそんなに変わらんじゃん
そう言うわけではないの? >>566
> VBAなんかじゃなくてドットNETに移行したら?
MSに言ってくれよ... そうじゃなくてエクセルを使う必要なんてないんじゃないのって事です
.netでもエクセル以上の事も出来るし
エクセルの制約がない分簡単な気がするんだけど
しかもコード的にも少ししか変わらないし 処理対象がエクセルならvbaのほうが手軽
そうじゃないなら他の言語のほうがいい
とか言いつつ俺はエクセル処理にpowershell使ってるけど 個人ならいいけど会社だとエクセル使いの方が多いから合わせないとならんしな
スマートで無いやり方をしているのは思いつかないからではなく他に方法がないからなのであって、
その代替手段は「君だけが思いつける冴えたアイディア」ではないんだよ >>568
> そうじゃなくてエクセルを使う必要なんてないんじゃないのって事です
お前のところがそう言う環境ならそうすればいい
> .netでもエクセル以上の事も出来るし
Excelを越える操作性を持つアプリを開発できるの?
>>569
> とか言いつつ俺はエクセル処理にpowershell使ってるけど
PowerShellは癖あるけど慣れると楽だよね
Windows 10 に移行して PowerShell 5.0 の class や enum が使えるようになったから嬉しい
と思ってたら Excel も 2013 → 2016 になってて以前のスクリプトがエラーになる...
新年度はまずはこの修正からだな ExcelはUIとしては優れているじゃないか。
これを利用しない手はない VisualStudioにOfficeSDKがあるからアプリとして簡単に作れると思うけど
豊富なオプジェクトツールもあるし
スピード速いし制約が少なくて簡単だと思うけどね
まぁ好きなの使えば良いんだけどね 簡単にっていうレベル感によると思うけど、どんなもん? >>574
ここの質問の出来たり意味とか分かるレベルならそのまま移行出来ると思うくらい簡単
文法はほぼ一緒
エクセルの制約って結構キツくて自由がないのでやりたい事も大回りしながらになるし 簡単に(ただしVisual Studio使用許可を会社に貰う労力は除く) VSのライセンスを事務屋の分まで手配してくれる会社ってどんなところだろうか。 >>573
VisualStudio OfficeSDKでググってもOffice Developer Tools(Visual Studio Tools for Office (VSTO))の話とかしか出てこない
お前さんほんとに使ったことある? >>568
>しかもコード的にも少ししか変わらないし
お前VB.Net仕事で使ったことないだろ
いくらなんでも舐め過ぎだ
コード的にも少ししか変わらない?
本当にうわべしか見てないのによくそんなことが言えるな
文法的にほぼ同じというだけで
内容的には同じフレームワークのC#とかの方に遥かに近いわ
お前、そんなこと言いながら.Net系の仕事に入ったら一発で首飛ぶぞ >>571
PowerShell + Excel か〜
なんか面白そうだから勉強してみよう 教えてください。
特定のフォルダの中にxlsファイルが一つと、xlsmファイルがあります。
これはシステムの前提です。
xlsファイルが2つ以上ある場合はエラーが出るよう、以下のように作りました。
ThisPass = ThisWorkbook.Path
With CreateObject("Scripting.FileSystemObject")
For Each ff In .GetFolder(ThisWorkbook.Path).Files
If LCase(.GetExtensionName(ff.Path)) = "xls" Then N = N + 1
Next
End With
If N > 1 Then
MsgBox "xlsファイルが" & N & "個見つかりました。" & vbCrLf & _
"xlsファイルは1ファイルだけおいてください。" & vbCrLf & _
"プログラムを終了します。 "
Application.Quit
ThisWorkbook.Close SaveChanges:=False
End If
質問ですが、
そのフォルダの中に一つだけあるxlsファイル名を取得するには
どうしたら良いでしょうか。
"*.xls"の条件に合うファイル名を返したいです。 既に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 >>683
メインモジュールのローカル変数としてユーザー定義型のインスタンスを作って関数へ参照渡しするんだけど
シートモジュールからの参照はできないかな?(やったことないので何も言えない)
ユーザーフォームに参照させる方法はインスタンス作ってそのメンバー変数に参照を渡すように作れば良い >>683
抜け訂正
ユーザーフォームに参照させる方法はユーザーフォームのインスタンスを動的に作ってそのメンバー変数に参照を渡すように作れば良い >>686
いろんなとこから参照できるからグローバル変数と言うのであって、そういうものは極力作らない、が原則なんだよね
それともシートモジュールのローカル変数はグローバル変数と呼ばないって理屈? >>688
その原則はグローバル変数しかない時代を経験してきたジジイ達の遺物なんやけどな
今どき無理してグローバル変数を禁止する必要はない そんなことないだろう
並列化が進んでますます大事になってるような気がするんだが .xlsxでVBAを使う方法を教えろ。
仕方なくワークシート関数で書いたら長過ぎると文句を言われる。ゲイツ氏ね。 Windowsを作ったビルゲイツは人類史上最大の貢献者なのは間違いない
貴方も恩恵を受けている >>685 一発やらせて
Sub Macro1()
Application.Calculation = xlManual
For r = 1 To Cells(Rows.Count, "D").End(xlUp).Row + 1
If Val(Cells(r, "B")) > 0 And Val(Cells(r, "C")) > 0 Then
Cells(r, "E") = "=B" & r & "*C" & r
ElseIf InStr(Cells(r, "D"), "合計") > 0 Then
Cells(r, "E") = "=SUM(E" & r1 & ",E" & r - 1 & ")"
Else
r1 = r + 1
End If
Next
Application.Calculation = xlAutomatic
End Sub >>691
気がする程度しか言えん程無知やからそもそもそれが老害の悪習か真に価値のある原則なのか理解しとらんやろ?
お前がそうしたい時はいつでもグローバル変数使ってええんやでw それこそ>>685みたいなのはわざわざマクロなんか組まんでも数式で十分なんだけどな >>698
たくさんあっていちいち数式設定するのが面倒〜!
とかじゃね >>698
「気がする」以上のことはなかなか言えんな
素人だしな 皆さんに質問です
シートの標準機能や関数で出来ることでもわざわざVBAで作りますよね?
その方が仕事してる感じするし
プログラムやってる感でますもんね
違いますか? 同じ数式で参照するセルを2箇所ずつ変えるだけ、みたいな単純な繰り返し作業だと、むしろミスを防ぐためにVBAを使ったりするけど 違います。
他の人が使えないのでなるべく関数で処理、VBAはコピーとか貼り付けとか二つ以上のファイルでやり取りするとか関数では実装できないことに限定してます。 VBAでユーザーフォーム作ってとかしてるんでしょ?
で、それに入力させてるんでしょ? シートに関数埋め込みたくない場合はvba使うかな? office作ってる連中がプログラム自体仕込むの嫌だからほったらかしってマジなの?
今更vbなんて学習する価値すらねえし本気で時間と労力の無駄なんだけど
jsとかpythonくらい対応する気ねえのかよこのうんこ ユーザーフォームできちんと作り込めば簡単になって便利なんだし 凡人が作るエクセルファイルはデータとロジックとプレゼンテーションが一つのシートに一体化してるから気持ち悪いんだよね
プログラミングを学習するとだんだんシートからプレゼンテーションが減って、単純なテーブルだけのシートになる
そのテーブルからも次第に関数や重複列、繰り返し項目、殆ど空欄の列が取り除かれてテーブルが正規化される
最終的にユーザーIO専用のシートあるいはフォーム、ロジックを置くVBA、それとデータ専用シートに綺麗に分かれてしまう
ここまでくるともはやエクセル、エクセルVBAにこだわる理由は無くなる
C#やPowerShellと手頃なローカルDBでサクッと作ってしまう方が簡単で高品質 なんで仕事した事無いのに仕事を語りたがるのか これが分からない 区別できないから何にでもエクセルVBAを使うんだろうね
ここぞという時に使うならいいけどね
いろんな選択肢がある中でエクセルVBAがベストってパターン殆どないんだよな >>710
> ここまでくるともはやエクセル、エクセルVBAにこだわる理由は無くなる
基本的にお前みたいな勘違いしてる奴の方が圧倒的少数派だからなw
エクセルがお手軽統合開発環境だと思ってるやつw
大多数の普通の人はvbaはあくまでアプリを拡張するためのマクロ言語だと心得ているからw ちょっとしたマクロもPowerShellでいいじゃん
楽だよ >>715
いいわけないだろw
だからそもそもマクロの目的を勘違いしとんねんお前w >>717
なんでも答えだけ聞こうとするからそんなマヌケな勘違いばかりするんだよ
何のためにアプリにマクロ言語が搭載されているか少しはその寝惚けた頭で考えてみろよトンマw VBAがベストチョイスではない(統合環境の構築申請や見慣れた拡張子以外に対する拒絶反応を是正する労力は含めない場合) そうそう
新人さんに教えるならVBAは避けた方が良いね >>717
>>714 に
> アプリを拡張するため
と書いてあるじゃん。アタマワル。 >>722
ならPowerShellでいいじゃん
アホなん? >>723
じゃ、お前、SQLの機能を拡張するのにもPowerShellを使うのか? 手段と目的が区別できない人は、そもそも目的が理解できないのか
目的のための最適な手段が判断できないのか
まあ、その両方なんだろうなぁ >>725
すまんそのジョークの面白さがわからんから説明してみて >>723
あんたの満足など知らんがな。
>>714の言う目的を訊いたんだろ。アタマワル。 >>730
SQLの編集?
馬鹿は用語をちゃんと使えんのか? >>732
すまん、スレチなんだろうが>>730の言うことは結構わかる
シート上のデータを元にinsert文こしらえたりselect文こしらえたりすんだよな >>735
馬鹿はそういう使い方かよ
例えばOracleならSQL*Plus、SQLServerならSSMSを使えよ。
で、EXCELでSQLの編集って何だ?用語一つまともに使えんのか? 実務経験してないと特殊な言い回しが伝わらないあるある >>736
外部データ接続でDBからデータ取り込むとき
SQL編集するよ 画像ファイルの取扱について教えてください
特定のフォルダに有る画像ファイル(jpg)を貼り付けるマクロを組もうとしています
貼り付け先のシートは複数あるので、ディスクアクセスを1回で済ませるために、
画像データを一旦メモリに読み込んだあとシートに貼り付けたいと考えています
ですが、画像の取扱については Pictures.Insert や Shapes.AddPicture のいずれも
ファイル名を指定するようになっており、画像データ(オブジェクト)を貼り付けるようには
なっていないようです
諦めて、必要回数分ディスクから読むしかないのでしょうか エクセルに使いやすいクエリエディタが付属してるってこと? エクセル上で完成予想図を手作りしてからSQL文考えるって事じゃないの >>740
PC の物理メモリが大きくて、それらの処理が連続で実行されていれば、
たぶん、その画像ファイルはメモリキャッシュ内にあるから、
ファイルから読み込まない SQL文を編集
SQLデータを編集
SQL設定を編集
これはあるけど、
SQLを編集なんて書く奴は必ず現場でおかしなことをしでかす馬鹿 >>746
よくいるよな、こういう些末な指摘をしてレビュー時間を食いつぶすおっさん
そのおっさんからしたら「将来のことを思って教育してやってる」つもりかもしれないが
この場で本当にその使い分けが必要なのかTPOをわきまえろよ >>746
だから君はまず現場経験してからそういう事言いなさい 寝る前にその文言に食いついて、起きてからも同じ事に噛みついてると考えるとちょっと面白い 待ってくれ
些細な言葉使いはいいんだよ
俺が知りたいのはSQL編集とエクセルの関係性の事なんだ
エクセルにそんな機能あったっけ? 知らんなら知らんでええやろw
知らん事を知れたんやから素直に教えを請えばええやんけw
ホンマにバカやなコイツらw SQL(Structured Query Language)の編集は、言葉として理解できる。寧ろ
> SQLデータ
> SQL設定
が分からん。 >>745
なるほど
今回の用途だと多分それで足りますが、メモリに溜め込んだイメージを貼り付ける方法は
わかりませんか? Excelの話じゃ無いだろ。
何でもPowerShellで良いという主張に反論してるんじゃないの?
まっ、俺はPowerShellの方が苦行だからOffice関連ならVBAにするけどな。
Office関係無い場合はPowerShellにすることもあるけどな。
けどPowerShellはそんなに慣れてないから別の選択肢にするかもね。 >>753
無理っぽいね
Shapes.AddPictureで追加したShapeオブジェクトを.Copyすればいいけど
クリップボードが汚染されるから俺はやりたくない >>753
そういう方法を知識として知っていたわけじゃ無いけど、多分出来るとは思う。
でもVBAでは結構高度になると思う。
もしあなたがそれを扱えるほどのスキルがあるなら既に気付いてるとも思うんだよな。
それに俺のレベルではそういうやり方のメリットも分からん。
取りあえずGDI系のCreateCompatibleDCと Bitblt系API使うのが平気ならメモリDCに溜め込んで、OleCreatePictureInDirect使ってPictureオブジェクトに変換するなんてやり方か、GDIPlus系APIを使用する方向が思いつくけど。 出来るかどうかという話ならWinAPIを扱えばいいだけだから出来る
でも出来るかどうかという質問でWinAPIを含めて答えるのは不適当な気はする
WinAPI扱えるならそもそも質問しないだろうし メインメモリーのアクセスって言うのがなにを意味してるのかわからんけど>>756辺りの話ならWin32API呼び出しでできる >>755
>>756
了解しました、よくわかりました
簡単にできる方法があってそれを知らないだけだろうと思っていたので、
簡単にできる方法はない、であればそれで満足です 画像をシートに貼り付けるだけなんだから普通にファイル名指定すりゃいいだろと思うのだが
ディスクアクセスもOSキャッシュに乗るんだから連続でやれば1回読んだだけで終わる VBAに限った話でもなく、よくいるんだよ
どこに時間かかってるのか計測もせずに
やれ最適化レベルを上げようとかインライン化しようとか
スレッド数減らそうとか根拠もなくトライして
時間を浪費するプログラマーがな つか非表示のシートにでも画像貼り付けとけば良いんじゃねえのか とりあえずそのまま画像を貼り付けることにして作ったのですが、奇妙なバグが出て困りました
特定の画像ファイルだけ、指定したセルの一つ左上(C5に貼ろうとしたらB4)に貼り付けられます
それも、特定のワークシートに貼った場合のみです
同じ画像を2枚のワークシートに場所を変えて貼るのですが、(順番は無関係と思いますが)
最初のシートには正しく貼れて、次のシートだとズレてしまいます
たくさんある中の数個だけで発生する現象で、何の根拠もなくペイントブラシで画像をちょっとだけ
トリミングしたら発生しなくなりました
何が起きているのかわかる方いないでしょうか
下記のプロシージャを2回呼んでいて、違うのは引数のtargetRangeだけです
' 指定のセルの位置に画像ファイルのイメージを等倍で貼り付ける
Private Sub PasteImageFromFile(targetRange As Range, imageFilePath As String)
Dim image As Shape
Set image = targetRange.Worksheet.Shapes.AddPicture( _
filename:=imageFilePath, _
LinkToFile:=True, _
SaveWithDocument:=False, _
Left:=targetRange.Left, Top:=targetRange.Top, _
Width:=-1, Height:=-1)
image.LockAspectRatio = msoTrue
End Sub >>766
何が起きてるかは知らんけど、貼り付けてからもう一回位置調整すればええんでね? ツールバーにボタンとか並べる場合って方向操作できないですか?
普通に追加してると右方向に順番に並んでいくようですけど
そうじゃなくて下方向に数個ずつ並べていきたいんですが >>767
当面の対応としてはそれでしのげるのですが、何が起きているのかわからないと、
処理そのものにバグが残っていることになるので後々困るな、と
後々深刻な症状に発展しないとも限りませんし >>766
Excelのバージョンは?
ぐぐると2007で貼り付け位置がずれるバグがあったみたい >>770
excel2010を使ってます
画像データをトリミングしたら再発しなくなったのですが、今度は再現ができなくなりました
バックアップとっといてからやるべきだった VBAでAPI使うのってどれくらい難しい?
教本の中級レベルなんだが、最終的にはそれくらいやりたいなと思ってる
結局"何をするか"に拠るんかな >>772
ただ使うだけなら全然難しくない
APIを使ったサンプルをコピペするだけで使えるやつがネットにいっぱいある
大変なのは何万個もあるAPIの中から欲しい機能を見つけ出すこと >>773
その何万個もあるAPIを見つけるのに良いサイトとか知りませんか?
あれば教えて頂きたいです
さらに出来れば日本語だとベストなのですが >>776
ありがとうございます
でも英語なのでチンプンカンプン
日本語のコードサンプル解説がないと理解しにくいんですよね
もっと勉強します! win32api vba でぐぐればいっぱい出てくるやん C++やC#向けのサンプルコードを見てVBAで使えるようになれば一人前 昔ちょっと苦労した覚えがあると思ったら、あれはPerlでWindows APIを使うときだった >>779
piaでエクセルの機能呼び出してるコード見ると勉強になるよな ・すべての変数がグローバルかつ型宣言文字を使っての指定
・使われていない関数の山
・どこからも参照されていない変数の山
・変数名・関数名が英語・日本語・ローマ字の混在
こんな凄まじいコードを修正・機能追加することになって泣いています
自分まだプログラマ歴1年未満なので、単に超絶技巧コードを見て理解出来てないだけという可能性もあるなと思いここに来ました
vbaのコードではこういう読みにくいのも割とあるものなのでしょうか。そしてこういう書き方でも実は良いとされる場面があったりするのでしょうか 何日間で何人でどういう内容の作業をするの?
オジサンにおしえてごらん♪
価値相当の価格なのかも知らんし >>784
VBAでは割とよくあるよ
基本的にみんな低レベルだからコードも汚い
まあ書き直したほうがマシだろうね VBA担当は新人または使えないおっさんと相場が決まってるからな プログラマーとは認められない者
エクセルエンジニアw セルを変数代わりに使う素晴らしい見識をお持ちのクソジジイが同じ部署にいる 教本を読んでると
・メンテナンスしやすいスクリプト
・誰が見ても分かるスクリプト
みたいな項目が必ずと言っていいほど出てくるんだが、
酷いのはそんなに酷いのか?
今の職場は自分1人だけしか作ってないから可否が分からん コード読めないって言っているヤツは単なる知識不足が大半だけどな シートにフォームコントロールのボタンがあって、押すとシート上で条件を満たすセルを変化させる
そういうコードを書こうと思ってます。この場合、標準モジュールに書くべきですか?それともシートモジュールに書くべきですか?
一応前者かなとは思ってるんですが
>>791
変数名の付け方とかコメントとかそういうところでほんと読める読めないが変わってくることを最近実感してますね >>792
計算式とかは標準モジュールでもいいと思うけど全部シートモジュールの方が面倒が無い
別のシートから同じ関数呼び出したいとかいう話になってから切り分ければいい >>784
> 型宣言文字を使っての指定
とは何ぞ? データ型定義が凄まじいコードということ? >>794
文字の後ろに特定の文字を加えると、その型での変数を宣言できるんだよ
Sub test()
i$ = "test"
Debug.Print i
End Sub
みたいな書き方が出来る。
ヘルプでString型とかLong型とかの項目見てみると「型宣言文字は〜〜です。」って載ってる。 ああ、昔見た気がする。
VBAでも使えるんだね。書く機会があればイヤガラセで多用してやろう。 型宣言文字は互換性維持のための隠れ仕様にしてくれ
リファレンスに易々と載せるべきではない >>797
「その程度に簡単に思いつく弊害のような事をリファレンスの作成者が気付いてない訳がない」
というとこまで考えが及ばないほど自分の思慮が浅い事には気がついた方が良いと思うよ 正直、型宣言文字の何が弊害なのかよくわからない
今は使ってないけど昔は使ってて、これといった害はなかったからね Dimとか無しでコードの途中で自然に宣言できるので、
HowTo本に出てくる伝説の存在「全ての変数が最初に書かれていないとコードの読解に支障を来す勢」にとって不利なんじゃない? >>800
ああなるほど
Dim a&
みたいな使い方しかしてなかったから無縁だな
しかしすべての変数が冒頭になきゃいけない人たちって、Exit Function や Exit Sub のあとに出てくる変数も
そうなのかね? 初めて知ったがこれはむしろC#のvarみたいで必要な機能だよなこれ(同じだよな?)
問題は変数名$っていう目に優しくない文法だけだ >>801
そんなんモジュールの先頭にまとめるだろ
関数定義の後に出てくるモジュール変数とか鳥肌が立つわ テキストファイルをline inputでループして自分の名前が入っていたら、エクセルに張り付けていきたいんですけど、その際に抜き出した行を消してテキストファイルを更新して、最終的には自分の名前のないテキストファイルにするにはどんな作り方ですか? 抜き出さなかった行を別のファイルに追記していく
最後に元ファイルけして、別ファイルを元ファイルにリネームする N88-BASICもマイクロソフト製だったから、文字列変数には$、倍精度実数は#を付けるとか、当時は必須の知識だった
ところでDEFINTはVBAでも使えるんかな? ファイルの拡張子をBakにする
それを読んで必要な行を元のファイル名に出力する
これで必要な行が無ければファイルも消える >>809
更新する必要がないときにファイルを更新してしまうのは下策中の下策 >>805
数百MBあるようなファイルじゃなければ、
一括で文字列として読み込んで
一行ずつ処理して出力用の新しい文字列を組み立てて
読み込んだ文字列と新しい文字列に差分があれば
ファイルに一括で書き込むのが
性能面でも処理の分かりやすさでも優れてるよ 更新する必要がないのに更新されてしまったら
それは下策ではなくバグやぞ 初歩的な質問で恐縮なんだが
もしかしてマクロってやりたい事をコードでできる要素に分解するのが難しいのか?
俺はてっきり文法的な難しさが勝ると思ってたが、
実務に落とし込もうとした時に、この作業をどうやってコードに起こそう?ってフリーズしたわ そうだよ
VBAはエクセルを使った作業を助けるちょっとした拡張を書く分には適してる
でもそれ以外のエクセル関係ない処理を書くのにはお世辞にも向いてるとは言えん
そんで業務上で実用的な処理って殆どはエクセル関係ないんだよね はいはい、他の言語勧めるならVBA使う職場でIDE入れる許可取る方法も合わせて紹介してくださいね IDEなんていらんよ
WindowsならPowerShellが使えるからね インテリセンス無しで書くって状況を効率的と称するのはちょっと現実見えてないどころの話じゃないな >>818パワーシェルでスクリプト走らすための設定をするのが面倒っていうか、いちいち覚えてらんない
スクリプトを走らすための設定をするスクリプト無いのかなぁ >>812
理解力無さすぎ
(ファイルの内容を)更新する必要がないのに(ファイルの更新日時が)更新されてしまったら
って話な >>822
理解力無さすぎ
タイムスタンプが変わるのはファイルの更新ではない
って皮肉やぞw ちょっとなに言ってるのかわかりませんな
皮肉の意味も知らなさそうw エンジニアって言葉に違和感がある
VBAユーザーとかにしてくれ 悲報、VBAエンジニアさん皮肉を理解できないwww エクセル関数で出来る事は全てマクロでも出来ると思っていいのかな
今VLOOKUPを大量に使って元データのシートを4,5枚のシートに分けて転記してる作業があって、
このブック自体、ある意味完成されてるから業務上特に問題はないのだが
セルの中身を見ると酷く不恰好でな
背中がムズムズするから改善したいと思ってる >>829
関数はVBAで組まれているので、十分な理解の元でマクロを組めば同処理同時間になる。
それにマクロの方が無駄な機能を省くなど最適化しやすいので、処理時間は普通、 関数≧マクロ になる。
最近のバージョンだと関数はSIMD使ってたりセル単位で並列処理してたりと、
マクロで出来ない事やってるとは聞くんだけど実際問題処理時間に反映されてないんだよね。 >>831
> 関数はVBAで組まれているので
そんな珍説初めて聞いた >>832
珍説も何もMSDNに書いてあった事だからなぁ
最近のバージョンだと違うのかもしれないけど VBA マクロを外部 dll にて記述することは可能ですか?
VBA マクロから外部 dll を呼び出すことは可能ですか?
VBA の関数を外注したいのですが >>836
VBAのdll化ってのは聞いたことがないな
同等の機能をC++とかで書ければそれをdll化すりゃいいけど sheetオブジェクトさわれないと不便だろうからc#+OpenXML でdll作れば? >VBA マクロから外部 dll を呼び出すことは可能ですか?
圧縮用に unlha32.dll を使ってる。セキュリティがどうのこうの言われてたりしたけど
まぁ自分用途に使う分には問題ないし外部dllを呼び出せるか?って質問に呼び出す
例としてあげただけなんで。 >>836
Module1.bas のまま納入してもらえばいいじゃん。 VBAの仕事って何だよ
エロ画像の整理とかで圧縮ファイル扱うしun*32.dll系はむしろよく使うんじゃないの >>841
投資分野における RSIインディケーターをexcel 数式で使いたいのです >>844
それはファンクションプロシージャでラッピングすればいい話で、VBAの話ではない。 >>844
そんなんだったら関数本体はVBAもExcelも関係ない汎用的な言語で処理を書けるから、
VBA用のインタフェースを備えたDllを作るのは割と簡単な仕事だろうね。 VBAerは世界感が狭いからなんでもVBでやろうとするなぁ 開発環境をインストールできない環境では
VBAぐらいしか選択肢がない エクセルは統計に使う関数が一通り揃ってるんで投資分野は使いやすいぞ
インジケータならMT4とか使った方がいいような気はするけど >>807
88世代でもそこはN-BASICと言って
ジジイっぷりを発揮するべき >>847
エクセルで指定されたシートの範囲を dll にて取り出す方法がわかりません >>851
むしろエクセルはまともに統計に使える関数少ないだろ。重回帰くらいしかない。
相関行列や時系列分析なんかないし。自分で作るしかない
しかもエクセルじゃビッグデータは重すぎて、全体的な見通しも悪い。 他の選択肢を知れば知るほどもうVBAはねえわってなるよね普通
VBAに執着する人ってどんだけ勉強嫌いなんだろう >>853
VBAでシートから配列に変換してdllに渡す
計算結果は配列でVBAに返す
dll側はシートなどのExcelオブジェクトと切り離す >>855
そんな事言うためにこのスレに留まってるの? フォルダAにある現在開いているファイル以外のファイルをフォルダBにコピーし、
その後、フォルダAにある現在開いているファイル以外を削除する方法を教えていただけますでしょうか。
よろしくお願いします。 >>858
Dim fn as String
fn = Dir(ThisWorkbook.Path & "\")
Do While Not fn = ""
If Not fn = ThisWorkbook.Name Then
Name ThisWorkbook.Path & "\" & fn As "フォルダBのパス" & "\" & fn
End If
fn = Dir()
Loop
これでどうかな
実験してないのでこけるかも知れない >>859
ありがとうございます。
理想としていたことができました。 >>848
ヴィーバアーって読むん? それともビーバー? ブック1のシート1とブック2のシート2を開いてシート2がアクティブの時、
シート1の選択範囲を取得する方法はありますか? 切り替わるタイミングでアクティブなセルの番地を拾っておけばできるんじゃないか。 エクセルのことわざわざ英語でEXCELって書くやつなんなん? 地味な違いだけど
ローマ字綴りの方がタイプしやすいと感じてる あーあー Eきもーちー♪
いや、思い出したんでついな(´・ω・`)b JIS(?)っぽい思想だとカタカナでエクセルなんだろうなぁ、とか >>865
こういうつまらないことにこだわる奴って気持ち悪いよね 複数シートの中で売上という文字列が入っているシートがいくつかあり、
そのシート内のB列にデータがないシートのみを削除する方法を
教えていただけますでしょうか。
宜しくお願い致します。 >>874
そのまえに、そんな乱暴にシートを削除してよいのか? >>874
ディテールの書き方が少し甘い
売上という文字列はシート名に入ってるの?
それともシート上のどこかのセルとかコメントに入ってるの? >>879
わかりづらくてすみません。
シート名に「売上〇〇月」と入っております。 その程度も書けないようじゃマクロ使わない方がいい。特にシート削除は理解してないと危険。 「B列にデータがない時」ってマクロの記録じゃ無理と違うか? マクロの記録でヒントでも掴んでみろって事じゃないの
みんなトライエラー繰り返してる中、トライもせずに質問投げるのは印象良くない >>874
・for each で全シートをなめます。
・シート名に「売上」が含まれている場合、さらにB列の値を数えます。
・条件に合致したらシートを削除します。
上2つはGGればいくらでも情報でてきます。
一番下はマクロ記録でわかります。
動作上不都合な挙動があれば、その挙動を潰す方法を調べます。
基本的な動作の羅列なので、がんばって。 シートを削除するのではなく、新しいファイルを作成する方向でやってくれないかな?
こういう素人が増えると困るんだよ。
一般人はファイルのバックアップもしないし、削除してゴミ箱まで空にして、ファイルを復元しろと言い出すから迷惑。 フォームやら速度が必須でない処理はVBSとかでやった方がいいね コレクションのforeach処理内で
コレクション削除したらヤバイんじゃないの >>874 を見直すと「売上」という文言が入っているシートと解釈した方が自然。
各シートのどこかに「売上」と入力されていたらという条件は不自然。 そうだね
一旦配列とかのコンテナに入れといて
for each アイテム in コンテナ
Worksheets(アイテム).Delete
next
が安全かな >>887
あらそうだっけ? じゃぁアプローチ方法かえないとね。
削除の度に再評価とか?
ワークシート数で回せばOK?
先に調査して配列格納したシート名で削除しにいくのが安全か。
どんな方法がスマートだろう?
>>885
ファイルのバックアップはそりゃやっておいた方が無難でしょうね。
それは作り手本人が実際に困ってその必要性を痛感した時点で
学べばいい。
元データが何かのシステムからExcel形式で何度でもサクッと出力
できるもので、その一次加工の工程ならなくてもいいと思う。 B列にデータがないのを効率よく判定する方法はなんだ?
背景色とかついてても空白セルならデータがないとすべきか
数式が入ってても結果が空白セルならデータがないとすべきか
半角スペースはデータがあると判定するのか
NaNやError Valueはデータがないとみなすか
考え出すと思ったより難しいなこれ >>892 B列最終行から上に向けてxlupして
データがあったら何行目か分かるから、
それで判定したらいいんでない?
と、俺は思った >>894
それで大丈夫かどうかは質問者にしか分からないので そんな自動化しなくてはいけないほど、シートの数が多いExcelファイルがあるなら、B列に値が入っていると決めつけているのも怖いよな。
そんなExcelファイルを作る職場だとExcelファイルのフォーマットが変更されていないかどうかのチェックも必要。 条件が曖昧ならここでうだうだ考えずに質問者に明確に書くよう言えば良いだろ。
それが出てこないなら質問の体をなさないということで却下するもよし、回答したい人間が自分の想像で
回答するもよしで。
質問に書かれていないバックアップがどうこうってのも、そんなもん質問者が考えれば良いことであってこっちが
どうこう考えることじゃない。 countaで対象範囲拾うだけだと思ったけど、データ有り無し判定。 >>898
下手な回答を書かれると第3者が参考にしてしまう。 >>864
同一EXCELアプリケーション内でも良いので教えていただけますか
>>876
Activeではないシートの選択範囲を取得するには、どのように記録を取ればいいでしょうか >>900
頭がおかしくて草
そんなもん参考にする奴の責任だろw >>901
やったことがないけど、ワークブックオブジェクト変数を使えばできるかな。 ちょっと教えて下さい
列挙型の項目に数字が先頭に来ると表示が変になるのですが、なんとかなりますか? 何がどうなってるか具体的な事一切説明せずにおかしい!おかしい!って言うのがこのスレの質問者のデフォ w >>901
アクティブなシートをコードで切り替えていけばSelectionで取れる
たとえば
Workbooks("Book1.xlsx").Worksheets(1).Activate
Debug.Print Selection.Address
Workbooks("Book2.xlsm").Worksheets(2).Activate
Debug.Print Selection.Address
これで両方ブックの選択中のセルアドレスが出力されるはず
選択範囲という概念はActivateされているシートにしかないので
これ以外の方法でやるなら>>863のようにどっかに書き出しておく必要があると思われる >>906
それだとAddressプロパティを持たないオブジェクトがSelectされてるときにエラーにならないか?
TypeName(Selection)で"Range"が返ってきたときだけ番地を拾うようにするとか、Shapeオブジェクトの場合はTopLeftCell.Addessを拾うようにするとか >>907
たとえばーなので、あとは>>862の好きにしてってことで
そもそも2つブックを開いてセルを選択するという操作を人間がやる必要性があるのか
自分だったらそこも自動化したいと思いましたとさ 興味本位で触り始めて面白かったから本腰入れて勉強してるんだが
教本レベルから実務までのハードルが結構高いな
これ、基本的なコード覚えてしまえばほとんどパズルだよね?
上手になるとまた別の見え方ができるんかね >>908
ありがとうございます。
ひとまず、ワークブック切り替えで対応してみます。 >>909
実務レベルで使えるようになってから自分で作ったプログラムを見てみると確かに基本的なコードや基本的なアルゴリズムのパズルでしかないと思えるが、教本を読まないとコードが書けない初心者のうちからそのように侮っていても実務レベルに到達することはない
パズルの組み方そのものが問題になるからだ
実務で行いたい処理があるという前提で、そのためにVBAで実現する機能はどのようなものか、どのようなコードを書けば安全かつ確実に期待通りの機能を実現できるか、というベクトルの思考を繰り返して試行錯誤する以外に近道はないぞ 現在、入力ファイルAの体裁を整えてファイルBとして出力するツールをVBAで作成しています。
その中で、入力ファイルAではS-JISになっている文字コードを出力ファイルBではJISにしてほしいと頼まれています。(先方でのファイル取り込み時の都合のようです。)
自分で調べたところ、文字列を1文字ずつVBAのAsc関数でS-JISコード(10進数)にして、さらにHex関数によりS-JISコード(16進数)に変換するところまではたどり着きました。
さらに、ここからS-JISコード→JISコード変換のアルゴリズムに当てはめればJISコード(16進数)までは取得できると思います。
そこで質問なのですが、JISコード(16進数)から日本語文字列を復元する方法はあるのでしょうか?
Chr関数ではS-JISコード(10進数)には対応していてもJISコードには対応していない?ようでした >>912
16ビットのJISコードに変換したら上位8ビットと下位8ビットに分けてChrB関数で1バイトずつ出力すればいい >>912
文字コードなんか自分で変換するより既製品を使った方が早いよ
変換ツールや変換関数は無数に公開されてる >>913
そうなんですか?不勉強でした
>>914
ありがとうございます
今日はもう帰宅してしまったので明日試してみようと思います
>>915
それはそうかもしれないですが、どうせ他にも色々とツールを介して値やフォーマットをいじったりするので、別のツールを使わずについでに直せるならその方が楽だなって思いまして
繰り返し使うものなので、一手間増えるだけでもヒューマンエラーを呼び兼ねませんし Get-Content ./Input.txt -Encoding ([Text.Encoding]::GetEncoding('Shift-JIS')) |
Out-File ./Output.txt -Encoding ([Text.Encoding]::GetEncoding('ISO-2022-JP')) >>916
そのひと手間のヒューマンエラーよりお前さんがバグを作り込む確率の方が高いと思われ >>912
なんでADODB.Stream使わないのか理解に苦しむ 日本語の方言の違いなんて、自分で調べられない
Ruby を使え >>916
そもそもなぜExcel VBAでやるのか? PowerShellなら1行で終わり
VBAは金とって無駄ばかりなんだから参っちゃうよ ちょっと待てオイ、kanjiコード変換機能ぐらい標準で提供されていないのか。
何かの参照を有効にする程度で実現できないと、VBA、幾らなんでも使えないんじゃ。 VBAは子供のオモチャ
幸い日本のビジネスマンは子供レベルしかいないので重宝されてる 日頃の鬱憤を「VBA使えない」と喚くことでしか発散できないってのもなかなか可哀想だなw
本当に使えなかったら普及してないんだけどそこまで頭回らない辺りが不憫 使える・使えないが普及率に直結するとか世界観チープすぎるだろ
VBAはチープな言語だからお似合いっちゃそうだが 「直結する」なんて言ってないんだけどw
お人形遊びが好きだねぇ図星を疲れたのがそんなに悔しかったんだな >>919>>928
ありがとうございます
ADODB.streamを調べていて気になったことがあったので重ねて質問させてください
いくつかのウェブページを見たところ、ADODAを利用するときには参照設定Microsoft ActiveX Data Objects 2.8をチェックしろと書いているページがいくつかありました(書いてないページもありました)
自環境で試したところ、特にチェックしなくてもADODB.streamは動作するみたいなんですが、この参照設定はどういうためのものなんでしょうか? >>931
煽るならせめておのれのスペルチェックぐらいしろ、と
あんたのインテリセンスを疑うぞ、と
見たり読んだりする前に、指が違和感感じねえの?
フィジカルセンスも疑っとけよ >>932
Object型で使うなら参照設定はいらない
その代わりエディタの補完機能は使えないけど、動作に支障はない >>934
あー、そういうことなんですね
ありがとうございます
スッキリしました VBAでHTMLに入っているJavaScriptのオンクリックを配列に入れたいのですがヒントを下さい >>933
タイポ指摘でドヤ顔って子供でも恥ずかしくてできないことをようやるねぇ >>909
亀レスだけど、多分最初に「何言ってたんだろ俺・・・」となって
その後しばらく続けた後に
「あれ?パズルって違った意味で正しいじゃん」ってなって
更に少ししてから
「最初に言った意味と後で考えた意味って違うと思ってたけど実は根本は同じだったんだ。
やっぱり俺は正しかったんだ!!」
・・・ってなると思う。多分。
君の言ってることは正しいから
そのままの考えでやって行けばいいと思うよ。 発言をリファクタしたいが
そもそも意図がわからない
まさにVBAメンタル なぜここにいる者がみなVBA「だけ」やってると思ってるような発言している人がいるんだろう。
何かと便利だからVBA「も」やっている人もいるというところまでの考えに至らないのかな? 何かと便利?
そもそもまずこれVBAじゃなくてよくね?じゃ?
仕方なくVBA使うはめになるんだが おれはここ数年VBAなんてやってないよ
Excelに関する処理はVBSやPS VBAはマジで他になにも使えない厳しい環境にいる人かなんかこじらせた人が使うもの
でも標準でPSあるから他になにも使えない環境ってのは今は滅多にないんだよね PSがVBAより便利とかいうやつはそもそもVBAの用途がわかってないとしか思えん ここはVBAのスレだからVBAの話をするんじゃないのか
別に他の話題を出すなとは言わんが、なんでVBAなの?みたいな話は流石に空気読めてないかと なんでVBAなの?は一つの案としてアドバイスでもあるだろ
100キロの道案内をチャリで行くにはどうしたらいいですか?
って聞いてきたら、まずなんでチャリなの?ってなるやろ 「なんでチャリなの?」をサイクリングスレで言い出すクソバカはどんな脳みそしてるんだって話題でしょ
海を渡りたいとかいう話なら別だけどチャリで行けそうだからチャリの話題を出してるのに
「チャリは疲れるから車で行け」とか「これだからチャリンコ乗りは」とか言い出すのは場違いに決まってるだろ >>927
VBAが普及しているの(か?)なら、その理由は単にExcel付属だから。
VBAが使える言語であるという証左にはならない。
VBS見りゃ分かることだと思うが、そこまで頭回らない辺りが不憫。 >>947
逆だろう
このスレにはVBAの用途がわかってない奴ばっかり
文字コード変換とかバカなことを言い出す >>952
だから全言語を比較検討した結果の使える使えないが普及に直結してるなんて話じゃないし
どんなに否定しようが実務において使えるから普及してんだよ
むしろ碌な知識の無い事務員ですら使える言語が使えないお前の脳みそを嘆け ここに居る奴は賢いのかもしれないが、スレチな役立たずの無能なレスする対人関係拗らせてる奴しか居ないのか… ブックの中に「名簿」と「納付書」というシートがあります。
そして「名簿」シートのF1に数字の1が入っており、A8以降に行番号が入っています。
納付書には名簿F1の値にあわせてVLOOKUP関数で返される値が入るようになっています。
そこで、F1の番号が2ずつ繰り上がるごとにシート「納付書」を印刷し、それをシート名簿のA列の最終行の数字まで繰り返す
(A列の最終行が奇数の場合にはその番号の次の偶数で終わるようにしたい)
というコードを教えてください。
↓のコードだと一つのシート内でしか機能しないです
Sheets("名簿").Select
For i = Range("F1") To Range("F2") - 1 Step 2
Range("F1") = i
ActiveSheet.PrintOut
Next
End Sub >>950
たまにマジで海渡りたいレベルの質問あるやん
仕方ないからフェリーに載せろって言ってもチャリじゃないとか言い出す奴いるし >>956
何ができないって言ってるの?
「納品書」を印刷したいんならActiveSheet.PrintOutの前の行に
Sheets("納品書").Selectとか入れればいいだけに見えるが あとは印刷の次の行にまたSheets("名簿").Selectか >>954
VBAに取り憑かれるとこうなるのかな
どうしてもVBAをイケてるから普及してる言語に認定したいらしい
現実には他の選択肢を調べる発想すらない素人がなんとなくMicrosoftのブランドと簡単って宣伝文句につられて使ってるだけ
そりゃユーザー数だけなら多くなるわな ループ処理で以下のクリップボードに変数を格納する関数を通すと2回目でエラーになってしまいます
原因がわかれば教えてください
関数
Sub clip(strwork As String)
With New MSForms.DataObject
.SetText strwork '変数の値をDataObjectに格納する
.PutInClipboard 'DataObjectのデータをクリップボードに格納する
End With
Exit Sub
End Sub
エラー内容
実行時エラー'-2147221040(800401d0)'
DataObject:PutClipboardOpenClipboardに失敗しました
このあとSetCursorPosとSendKeys "^v"を使ってブラウザ上のテキストに貼り付けしてます
1回目の貼り付け時にブラウザが固まっているのでそれも影響しているかも知れません
よろしくお願いします >>927
あってしかるべき機能がもし無ければ使えない
という文意じゃないか
暴れる前にまず正しい読解から始めよう バカが何をどう言おうが現実にVBAは使えてるし使われてるんだよ
顔真っ赤にしてバカなこと言う前に正しく現実を見るところから始めよう >>958
>>958
ありがとうございます
それと今はF2で最終行を取得していますが、F2をやめて
「A列の最終行まで」処理をする方法もお願いします。 Sheet選択についてSheetが7つあります。
Sheet1/Sheet2/Sheet3/1/2/3/4
Sheet名「1」を選択するためにはこの方法しかないでしょうか?
------------------------
Dim cnt As long
cnt = 1
sheets(”” & cnt & "").select
------------------------
↓これだとSheet1選択
-------------------------
Dim cnt As long
cnt = 1
sheets(cnt).select
------------------------- >>963
お前がな
まあVBAerは一生VBAで無駄な工数払ってればいいよ
まともな人は他の選択肢を見つけるから >>966
まともな人は「VBAで作って」と言われたらVBAで作るんだぜ
しかもPowerShellやらC#やらRubyやらで工数かけた分は依頼者が受け取らないから全部無駄になるんだぜ
今まで知らなかったんだろうけどこれで一つ勉強になったな まともな人はまずVBAでやるべき仕事か判断して別の選択肢も提案するんだよ
言われたことしかできない底辺には難しいかもしれないがビジネスってそういうことなの 近頃やたらとパワー系バカが暴れとるなw
一体どうしたんやコイツw >>968-969
VBAスレでこの意見が通ると思ってるんだからマジ信じられねぇよな
まともじゃないヤツの言う「まとも」を誰が信じるんだよっていう >>965
シートを特定する方法は3つあって
1.オブジェクト名
2.シート名
3.インデックス番号
で、あなたのやり方はシート名
オブジェクト名はVBEで確認できて初期値は追加した順にSheet1〜なので
その場合、 Sheet4.Select でも選択できると思う
オブジェクト名は好きに変えられるので
わかりやすい名前にしとおくと、誰かが勝手にシート名を変えようが
そのオブジェクト名でシートを指定できるのでオススメ
インデックスで指定するなら Sheets(4).select
インデックスは単純に左から数えた順番ね >>965
あと
Dim cnt As String
にして文字列で代入すれば()の中にダブルクォートがいらないから見やすくなるよ
cnt = "1"
Sheets(cnt).Select 別にプロの仕事として使われてる訳ではないと思うけどね、VBA。
Excelの使用頻度が高い事務職とかの人が使うイメージ。
何でもかんでも金払ってシステム化してくれる会社なんて無いし、例え使えたとしても簡単に他の言語の開発環境を手配できる訳でもないし。
powershell推しの人はメモ帳で書いてるの? >>965
要するに数値の 1 から文字列の "1" を作ればいいので >>973 以外にも
sheets(CStr(cnt)).select
とかでもいい
シート名が 0001 0002 ... となってたら
sheets(Format(cnt, "0000")).select
なんてこともできる >>961
Excelからブラウザに値を送りたいだけなら
クリップボードを経由しないでDOMでやるのがいいよ
VBA DOMでググるとたくさん解説があるよ
IE限定なので宗教上の理由がなければだけど >>976
Excelと関係ないことをExcel VBAでやりたいという質問者がいる。
文字コード変換をExcel VBAで自作するので教えてくれという人間に対して、VBAを勧めるのはいくらなんでもおかしいだろ。 実際VBAでもADODB使って数行でできることなのに何をそんな発狂してるんだよ 処理の進捗をテキストボックスに表示する方法なの
ですが何かサンプルはありませんか?
出来れば自動的にスクロールしてくれるといいのですが >>972
>>973
>>979
アドバイス頂き有難う御座います。
他の方法があるのは知らなかった、、、。
勉強不足でした。
m(_ _)m >>980
chomeなんですが別の貼り付け処理にしたらさくさく動きました
ありがとうございます >>983
普通にプログレスバーを使えば良いと思うが
https://e-vba.com/progressbarlabel/
プログレスバーをLabelで作成する方法
とかは? Excel エンジニアは、プログラマーじゃない。
企業内のExcel マクロエンジニア
Excel は、表示とデータが合体しているから、プログラミングが難しい。
Rails などの、MVC みたいに分かれていない
Excel は、データをexport して、Ruby で処理して、import するのが、最も簡単。
これで表示関係なく、ビジネスロジックだけに集中できる
>>976-978
VSCode >>986
もしかしたら
自分の作った処理の進捗をどうやって算出すれば良いですか
という意味の「勝手に計算しろ」的質問かも知らん 進捗の表示で自動スクロールって、処理ログを表示したいって事じゃないのかな
全体像が分からないから提案すら出来ない状況だけど Debug.Printでイミディエイトウィンドウに出力するみたいなことをフォームでやりたいってことじゃろ
このスレ住民の読解力低すぎない?実務でクライアントの意向理解できてるの? >>990
まさにそれです
Debug.print で表示された内容を
テキストボックスに表示させたいです >>987
お前EXCELに何やらせようとしてんの?w
MVCモデルなんてシステム作成するときに使うもんだろ
EXCEL上でデカいシステムでも作るつもりなのかよw
RubyやC#が悪いとは思わんがお前の頭は相当に悪そうだなw >>992
自動的にスクロールは難しそうなので最新の進捗を1行目に追記するようにした方が楽 >>987
プログラマでもなく、マクロエンジニアでもない。
ただの事務職。
関数では面倒な処理をVBAで書くだけだ。 >>993
こういうバカがクソ使いにくいbookを作るんだよなぁ MVCでもMVVMでもなんでもいいけど入出力とデータを分けてくれ
そしてデータを正規化してくれ
VBAerさんはその程度の基本すら出来てない人ばっかりだ
そんなんじゃブック渡された方も迷惑だよ 自分の頭の中にしかいないVBAerとやらの話をここでされてもなぁ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 89日 21時間 57分 51秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。