Excel VBA 質問スレ Part57
■ このスレッドは過去ログ倉庫に格納されています
ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part56 http://mevius.5ch.net/test/read.cgi/tech/1534976724/ >>33 意味がない、ではなくおまえには意味がわからんのやろ 知ったことかそんなもんw甘ったれんなカスw excel vbaでテトリスとか作れるようになると、excel vbaを使いこなせられるようになったと思っていい? >>37 いくない、Excelはゲーム作成用ツールじゃない >>37 いいんじゃね テトリスができるようになれば次の課題が見えてくると思う テトリス作れるレベルならそこらへんの私VBA得意ですドヤよりスキル的に遥かに上だから、 VBAらしく事務処理の自動化をやるくらい楽勝だよ テトリス作る時間に他の勉強をするべき。 そこまで求められてないから無駄。 >>37 字面だけでいえば、「Excel VBAでテトリスが作れるレベル」なら、「Excel VBAはそれなりに使いこなせる」と言える。 ただ、それを訊いて何をしようとしているのか分からない。内容次第ではおすすめしない。 それなりというか世の中の自称VBAのプロのほとんど全員より上だろう それ以上の人はVBAできますなんて恥ずかしくて言わない エクセルVBAでテトリス作るのは芸ではあるけど実用的じゃない どうせならエクセルで機械学習とか実務に使う余地があるものやれば プログラマはVBAできます なんてわざわざ言わない 他言語ができればできて当たり前だから >>43 vbaを使いこなせられるというか、これが作れるようになれば、この先いろんなツールをつくろうが、 応用がきくという意味で、テトリスという題材を選んでみた。 俺、間違ってることいってる? vba使いこなせられるになる基準として、何かこういうの作ってみろ的なことがあればいってほしい。 散らばった支社にプログラムを配るにしても、 完璧にシステム仕様が決まっていて、テストも十分終えたもの以外は、一つのExcelファイルに プログラム 設定データ 蓄積データ をまとめるのはやめとけって忠告したのに・・・。 プログラムのバグ修正のたびに、支社の端末を直接操作しているVBAマスターを自称する後輩が・・・。 土日ももう呼び出し呼び出し。完全に病んでしまった。 あれほど忠告したのに・・・。 安易な作りでデータ等々を抱えると、プログラムの修正だけしたくても、簡単にはいかないから、 せめて蓄積データだけは別のエクセルファイルなりに保存して開いて使うなりの仕様にしとけと・・・。 >>47 勘違いしてるようだが、テトリスはプログラミングの練習ネタとしてはかなり難しい部類だ テトリスを自分で設計して作れたら、VBAを使いこなせるどころか世の中でVBAのプロを自称する連中の中でいきなり上位に入るレベル それくらいVBAのプロのレベルは低い つまり何が言いたいかっていうと、テトリスはやりすぎ 家計簿くらい作れたら十分面接でドヤっていいよ >>48 どういういみかもう少し噛み砕いてほしい 私よく意味はわかってないけど今まさに同じ道を辿ろうとしてるような気がする 多数ユーザー向けにマクロを配布するならもうアドインにした方がいいよな で、データの方はプログラムとのやりとりに支障が出ないようテーブル名、スキーマ、データフォーマットを固定したソースファイルに別途保存させる方がいい アドインやCOMアドインのベンダーにインターンで行ったが、VBAどころか、C++でガリガリ開発するスーパープログラマが何人もいて、速攻で就職先から外したわ C++でガリガリ開発しててもなんとも思わない VBやウンコスクリプトでガリガリ開発してるのは サルがオナニーしてるようにみえる もしくは奴隷が単調な動作を繰り返してるようにみえる >>52 取っつきにくさでいうと、すでに子供の頃から馴染んでおかなければならないイメージ 俺みたいに遅蒔きで大学に入ってC++を初めてさわったレベルでは追い付けないな、と思った きっかけは分析ツールみたいなアドインってどう作るのか知りたかったという位、その程度の熱意じゃ無理 VBAのほうが文法、ライブラリ、コミュニティレベルがお粗末だから難しいかな モダンC++は昔とくらべてびっくりするぐらい生産性高いからね >>48 アマチュアの限界が来たんだね 後はプロに引き継ぎなさい セル内に "aiueo" とか ≪aiueo≫ が格納されていたとして、 囲い文字だけを抽出するにはどうすればいいですか? "aiueo"の場合は、全部半角なので、配列に代入して、配列の先頭と末尾を参照すればいいのだが、 ≪aiueo≫の場合、全角・半角の区別がつかないので(どちらでもない?)、どうやればいいのか。 >>59 まともなプログラマなら正規表現を使う VBA厨止まりでいいならLeftとRightを使う A B 1 "aiueo" =(LEFT(A1,1))&(RIGHT(A1, 1)) ⇒ "" 2 ≪aiueo≫ =(LEFT(A2,1))&(RIGHT(A2, 1)) ⇒ ≪≫ オレならVBAなんか使わずにこうする >>60 正規表現を使う場合 @事前に囲い文字を把握しておく Aコード内では、囲い文字をキーにgrep Bgrepの結果から、先頭/末尾に囲い文字が含まれていれば確定。 という流れですか? >>59 正規表現使えば何とかなるよ 基本的には、aiueoが見つかった場合に見つかった文字列の開始位置と終端位置からそれぞれ一文字分外側にオフセットさせた文字列を取ればいい "aiueo"のようにaiueoの中に2バイト文字が混在してる場合も抽出しなきゃならないような特殊な場合は文字列の範囲指定がちょっと面倒かもしれないが >>61 これ使えるね 全角の<、半角の<に入れ替えても、ちゃんと囲い文字だけを抽出してくれてる。。 >>62 囲い文字以外を置き換えで消しちゃえばいいんじゃね 検索文字列は"[^\(\)\[\]\"\'「」『』《》]"みたいな感じで 最初の一文字と最後の一文字取るだけならもっとスマートに出来るけど囲い文字が無い場合は括弧以外を抽出しちゃうし LENBなどB付き関数を使わない限り、半角全角は考える必要ないだろ?Excelは内部では全部Unicodeで扱ってる テトリスなんか複雑すぎて、VBA の奴に作れるわけないだろw 回転もあるし、壁にめり込んだり、 そもそも1秒に10回でも、描画できるか? そんな性能あるか? 一秒に1回しか動かんのになんで10回も描画せなあかんねんw 回転は最低3回/秒位必要だろうし、落ち速度が速くならないテトリスじゃかたておちだろ >>62 >@事前に囲い文字を把握しておく で、囲い文字があるかないか、事前に分類しておく 分類後、囲い文字があるものに対して、 vbaを使わずにleft、rightを使って抽出。 これで囲い文字の種類を全部押さえていることになる。 後は、コード内で正規表現(grep)使ってうまくやればなんとかなりそう。 ちょっとよくわからんのだけど "aiueo≫ とか ≪"aiueo" とか ≪"aiueo≫ " はエラーとして除外するの? >>47 VBAテトリスって余興みたいなものだから 応用力を見る題材というならたとえば 在庫や売上の情報から在庫切れや長期在庫 利益率ランキングを算出するとか 株式情報から各種指標を算出するとか そういうのがビジネス寄りで適切だと思う >>49 テトリス自体はそんな難しくない しいていえばゲームは全部GUIに依存するから その部分が複雑になりがちなだけ >>48 >一つのExcelファイルに > プログラム > 設定データ > 蓄積データ >をまとめるのはやめとけって忠告したのに 分かる 要はハードコーディングでしょ >>59 正規表現がプログラミングの正攻法 なお「<a><b>c</b></a>」 こういうタグの入れ子構造は 正規表現で処理するのは難しい ゲーム作れるから事務処理作れるっていう発想が実務浅いんだろうな VBAを使いこなしたいとは思っているようだけど、「事務処理に使う」とは言ってないのでは。 俺はそのままやってみたらいいと思ってる。Excel VBAでアニメーション作った動画とかもポロポロあるわけだし。 (https://twitter.com/excelprog/status/993022444221808640 とか) 目標が分からないし、何をやりたいにせよ好奇心を止めることはできないし。 https://twitter.com/5chan_nel (5ch newer account) 実用性で言ったら他の言語を使えばいいじゃんってなるから こうやってVBAを使うことそのものを目的にして遊ぶのは悪くないと思う >>68 テトリスってそんなに複雑か? ゲームの中では簡単に制作できるほうだろ JavaのAPI仕様みたいな、VBAのプロパティやメソッドが一覧になってるサイトや書籍てありますか? 他人のソース読むとき、公式のやつが英語のみで辛いんです…… >>47 ゲームを題材にするならRPGが最適じゃないかな RPGならデータをこねくり回すしExcelVBAの勉強には良さそうだが キャラや地図のデータをワークシートに保存して VBAでそれにアクセスしながらゲームを進行させる感じで VBAマリオだってあるんだし 作ろうと思えば、ある程度までは可能だろう そもそもVBAはアクションゲームに向かないんだよ もう技術がある人がそれを承知で芸をやるのは良いけど 実用にしたいならビジネス用の題材を取った方が良い >>83 RRGはテトリスよりは題材としてマシだと思う ドラクエみたいな普通のGUIのRPGを エクセル方眼紙で再現するとかだと筋悪いけど そうじゃなくてCUIのRPGで アイテムとかデータ構造の構築と管理を中心に組めば ビジネスにも応用が利くと思う csvファイルがあって、これをexcelに読みおませると 表が崩れてしまう。 csvの中身 -- 1,my name is taro 2,hello,world -- excelに読み込ませると以下のように表が崩れてしまう。 A B C 1 1 my name is taro 2 2 hello world 期待値は、hello,worldをコンマ(,)で区切らず、B1セル内に格納したい。 まずvbaを使わずになんとかできない? >>83 確かにRPGのほうがワークシートの保存とかデータ構造の管理とか色々関わってくるのでテトリスよりは題材としてマシなレベルですね 87ですが、vbaで加工しないといけない場合、どういった整形処理が考えられますか? >>87 CSVデータの仕様が悪い気がする。 カンマを含むデータならダブルクォーテーション""で括られているべき。 >>90 CSV(コンマで区切って表示するもの)なので、 hello,world→helloとworldに分割されるのは当然と言えば当然ですが、、。 逆だ CSVはこうしたほうがいいというメモを 無視してるのはキミラ低学歴知恵遅れなワケ カンマか改行かダブルクォーテーションが項目に含まれる場合 ダブルクォーテーションでくくるべきだ さらにダブルクォーテーションが含まれる場合、 2個のダブルクォーテーションでエスケープするべきだ https://tools.ietf.org/html/rfc4180 6. Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes. For example: "aaa","b CRLF bb","ccc" CRLF zzz,yyy,xxx わかった? >>92 1,my name is taro 2,hello,world ↓ 1,"my name is taro" 2,"hello,world" ※my name is taroは括られている必要はないが、統一した方が良い >>87 そもそも何がしたいのか? 1列目:ナンバー 2列目:内容 という固定フォーマットで区切りがカンマだってならそのように分解すればいい。 InStrで最初のコンマを探せばいいだろうよ。 >>93 つまり、CSVデータの仕様が悪いので、これ作った人になんとかしろというしかないか。 >>96 カラム数が一定かつ「hello,world」なカラムが一つしかないなら、泥臭いやり方で直すことはできなくもない。 >>96 はっきり言ってCSVデータとして「壊れてる」 というかどのカンマが残ってどのカンマが区切りなのか 理論的に説明できないならVBAだろうと無理 仕様はまったく悪くない 適切に読み込める 普通に矛盾なく読み込めるようになってる ちゃんと読み込めないのは頭悪いから 自分が頭悪いのを棚にあげるのはよくない A B C D E AHO " hoge,huga boo CRLF foo CRLF woo BAKA baka ↓ AHO,"""","hoge,huga","boo CRLF foo CRLF woo",BAKA crlf baka この形式で出力されてないデータはそもそもcsvじゃない >>95 最終的には表を 1列目:ナンバー 2列目:内容 にそろえたい。 2列目の内容には、英文が入る。英文には文章の区切り点としてコンマ(,)がよく使われる。 >>101 ・1行の列数はn列 ・カンマが含まれる列は最も右の列だけ の場合なら、左からn-1個目のカンマから右の文字列は全て問題のフィールドと解釈して処理すれば良い。 ああ、通常に考えるとまともに使えるCSVファイルではないので、 たぶん、CSVファイルを作成した後のことは何も考えないで作ったか、 あるいは特定のプログラム内でしか使わないことを想定したデータ(つまりCSVじゃない)かのどちらかだろうと思う。 もし前者なら、その仕様でCSVファイルを作成した(ツールを作成した)人には言っといた方がいい。 >>101 読み込む前に整形すれば良い PowerShellならワンライナー cat test.csv | % { $i = $_.IndexOf(",") ($_.Substring(0, $i), "`"$($_.Substring($i + 1, $_.Length - $i - 1))`"") -join "," } | Out-File "dest.csv" カンマが嫌ならタブ区切りにする どちらにしろ元データは要修正だよ >>86 そうそうCUIベースのRPG ワークシートごとにキャラデータやアイテムデータ、地図データなどを設定して CUIで画面構成して進行する感じ クエリワークシートなども用意して簡易データベース的に データを利用してゲーム進行してやれば結構いい勉強になると思う tsv形式のcsvファイルに作り直した方が良いと思うわ >>104 powershellならget-content使え 置き換えも-replace一発で正規表現で出来るだろ >>104 そんなややこしい事しなくても cat test.csv | %{ $i = $_ -split ',',2; "$($i[0]),""$($i[1])""" } > dest.txt でいいでしょ >>108 catはget-contentのエイリアス 正規表現使わなくてもできる 自分はこう書くっていうのがあるなら 僕にレスせずにそれを出すべきかと powershellが便利でVBAの出るまくなしってのはよくわかったけど ここはVBAスレだからせっかくなのでVBAで解答を書いてみてよ だいたい5行ぐらいでできるかな? Inputがtxtなので、中身をみてコンマ(,)で区切られているので、CSVと勘違いしてしまったかもしれない 作った人に、CSVか確認してみます。 CSV はカンマ区切りだから、列にカンマが入る可能性を考えて、各列を、" で囲む。 列内で、カンマを使いたい場合は、\ でカンマをエスケープする。\" 列内の文字列、a\"b 列、"a\"b" それか、TSV。タブ区切りを使う。 ただし、これも列内にタブを使わないようにすべき 基本、システムを知らない人には、設計(SE)はできない! こんなの誰でも知っている常識だからw また低学歴知恵遅れがテキトーなこと書きこんでるわ。。。 一般化すればこうなる 列のデリミタや行のデリミタ、もしくは引用符を含む場合 引用符で括る 引用符が含まれる場合、引用符は引用符の前に引用符を1つ記述する csvの場合、 列のデリミタはカンマ 行のデリミタはCRLF 引用符はダブルクォート になる タブ区切りの場合、列のデリミタはHTになる わかった? >>111 Dim fs, src, dest, line, i Set fs = CreateObject("Scripting.FileSystemObject") Set src = fs.OpenTextFile("test.csv", 1) Set dest = fs.OpenTextFile("dest.csv", 2, True) Do Until src.AtEndOfLine line = src.ReadLine() i = InStr(line, ",") Call dest.WriteLine(Join(Array( _ Mid(line, 1, i - 1), _ """" & Mid(line, i + 1, Len(line) - i) & """"), ",")) Loop Call dest.Close() Call src.Close() >>115 RFCはそうだけど "を\でエスケープするやり方もあるよね そんな低学歴知恵遅れマイルールは 低学歴知恵遅れのマイルールが通用するシステムでないと通用しない 低学歴知恵遅れのやりかたの別のファイル形式になる 低学歴知恵遅れのやりかたとcsvの形式は一切関係ないからな なんで低学歴知恵遅れは 低学歴知恵遅れのマイルールを押しとうそうとすうんの? 低学歴知恵遅れの世界でしか通用しないのに この内容のExcelをcsvに出力する A B C aho boo"foo baka aho boo"foo baka 普通に aho.csv aho,"boo""foo",baka aho,"boo""foo",baka と出力される こんな内容のaho1.csvをExcelにインポートする aho,"boo\"foo",baka aho,boo\"foo,baka 結果はこうなる A B C aho boo\foo" baka aho boo\"foo=@baka こんな内容のaho2.csvをExcelにインポートする aho2.csv aho,"boo""foo",baka aho,"boo""foo",baka 結果はこうなる A B C aho boo"foo baka aho boo"foo baka 当然 はっきりいってな 低学歴知恵遅れのマイルールなんかどうでもいいわけ 低学歴知恵遅れが出力するファイルはそもそもcsvじゃない >>120 エクセルの動作の話をしておられるわけですね それについては異論はないっす 一般的なCSVの仕様として"を\でエスケープすることも あるよねってことです RFCは後付ですし https://tools.ietf.org/html/rfc4180 7. If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote. For example: "aaa","b""bb","ccc" RFCにもちゃんと書いてあるからな excelでは読み込めない コレはもう業界ではペケなワケ もうデファクトスタンダードなワケ それが分からないから 低学歴知恵遅れなワケ >>122 RFCができる前からCSVは存在してるよ RFCとは違う仕様も存在するんよ デファクトスタンダードはそれはそうだと思いますよ 規格として標準なわけではなく事実上の標準だから "を\でエスケープするものがあってもおかしくないっすね ""でエスケープしたらエクセルでインポートできるよってことを言いたいんですよね、わかりますよ フォーマット微妙に変なのをExcelにインポートしたいってとこから話始まってるし いくら世界がそうあるべきだと言ったって 現におかしなフォーマットのcsvが目の前にあったらどうにかしないといけない 半角君はどうするんだろう >>87 のケースである場合、 どうしてもエクセルにインポートしてほしいという依頼がきたら サクラエディタつかって正規表現使って最初のカンマの部分をタブに置換してコピペする ファイルがクソでかいばあい、sedで正規表現使って最初のカンマの部分をタブに置換する サクラエディタもsedも使えない状況なら半角さんどうするんですか? sedが使えない = unixクローンは使えない ということになるからな wshならどんな古いくさった端末でも入ってるからな 個人情報の問題で、データを格納できる計算機が制限される、アタリマエだが >>120 実際に出てきたcsvでやるしか無いんだから出来ない言い訳並べてもしょうがないでしょ ある都合でVBAでプログラミングを学びたいんですが、おすすめの参考書やサイトありますか? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる