X



Excel VBA 質問スレ Part63
レス数が1000を超えています。これ以上書き込みはできません。
0005デフォルトの名無しさん (ワッチョイ 7f79-j7/x)
垢版 |
2019/09/16(月) 21:37:35.26ID:+LXKkUCe0
糞レスで埋めるなら前スレのCSVファイルをQueryTablesで読むサンプル残しとく超参考になった
967 デフォルトの名無しさん (ワッチョイ 1fce-Nl8y) sage ▼ New! 2019/09/13(金) 00:48:49.27 ID:VS8vqVEc0 [1回目]
文字列として読み込めば0は消えない
あとLineInputよりクエリのがずっと速い

サンプル

Sub CSVread()
  With Worksheets("Sheet1") '読み込むシート
  With .QueryTables.Add(Connection:="TEXT;C:\tmp\test.csv", Destination:=.Range("A1")) 'ファイル名とセル位置
    .TextFilePlatform = 932 '文字コード指定
    .TextFileCommaDelimiter = True 'カンマ区切り指定
    .RefreshStyle = xlOverwriteCells 'セルに上書き
    .TextFileColumnDataTypes = Array(xlTextFormat, xlTextFormat, xlTextFormat) '各列を文字列に指定
    .Refresh 'シートに読み込んで表示
    .Delete 'クエリを切断
  End With
  End With
End Sub
0007デフォルトの名無しさん (ワッチョイ 9f8e-J3NS)
垢版 |
2019/09/16(月) 22:04:26.30ID:mBMfeEcT0
全部丸投げの教えてクレクレは死ね
0008デフォルトの名無しさん (アークセー Sx73-Pq6P)
垢版 |
2019/09/17(火) 00:12:51.48ID:QL/1GsWjx
LongLong型に定数値として4,294,967,296を与えておきたいのですがLongの範囲を超えているせいか、必ず後ろに#が付いてしまいます
用途としては強引にunsigned Long的に使う為のオフセットなのですが#を付けない方法はありますか?
0013デフォルトの名無しさん (ワッチョイ 9f01-KBBU)
垢版 |
2019/09/17(火) 19:25:37.80ID:gAW2iwiH0
前スレの最後でセルに色をつけるコードを作って頂いた者です。職場で試してみましたが思い描いた通りに動いてくれました!これを機に自分で作れるように勉強したいと思います。作って下さった方、本当にありがとうございました…!
0015デフォルトの名無しさん (アークセー Sx73-CIVR)
垢版 |
2019/09/17(火) 22:00:10.80ID:g2VoYh6px
スレチなのは分かってるけど詳しい人がここにしかいなさそうだから、もし知っていたら教えてほしい

ブックに保存されたクエリをOLAP等で使い回すためにODCファイルとしてエクスポートしたいんだが、「既存の接続」コマンドからクエリのプロパティを開いても「接続のエクスポート」のボタンが無効になっていてうまくエクスポート出来ない
どうしたらうまくエクスポートできるのか知りたい
0017デフォルトの名無しさん (ワッチョイ 9f64-+dKN)
垢版 |
2019/09/18(水) 02:08:49.51ID:IoDIi0WV0
すみません。
エラーが分からず・・・教えてください。

下記コードで、”型が一致しません”というエラーが出ています。

Dim Ringi1 As Worksheet
ThisWorkbook.Activate
Set Ringi1 = Workbooks(Range("B6")).Worksheet("Sheet1")  ←エラー

ThisworkbookのB6には”テストファイル.xlsx”が入っています。

よろしくお願いします。
0018デフォルトの名無しさん (アークセー Sx73-CIVR)
垢版 |
2019/09/18(水) 02:37:53.20ID:6F01cvXOx
>>17
Worksheet(Range("B6"))じゃなくてWorksheets(Range("B6").Value)でしょう

あとRange("B6")はどのシートのB6セルなのかな?
この書き方だとThisWorkbookがActivateされたときにアクティブになってるシートのB6セルが参照されてしまうので、ちゃんとシートを指定して書いたらどうかな
例えばThisWorkbookの一番目のシートのB6セルにファイル名が書かれている前提ならこうなる

Dim Ringi1 As Worksheet
ThisWorkbook.Activate
Set Ringi1 = Application.Workbooks(ThisWorkbook.Worksheets(1).Range("B6").Value).Worksheets("Sheet1")
002617 (ワッチョイ 2964-9GzD)
垢版 |
2019/09/19(木) 01:19:41.82ID:vxcA2ILs0
>>18
コードをヒントにして、成功しました!
ありがとうございました。

めっちゃお優しいですね!!
0031デフォルトの名無しさん (ブーイモ MMf6-zDIv)
垢版 |
2019/09/19(木) 12:51:43.71ID:sRgRNGS8M
なにぬねの
0033デフォルトの名無しさん (ワッチョイ 298e-l2za)
垢版 |
2019/09/19(木) 14:27:24.46ID:nfvzk0j90
>>28
死ね、馬鹿
0035デフォルトの名無しさん (ワッチョイ 298e-l2za)
垢版 |
2019/09/19(木) 15:37:32.90ID:nfvzk0j90
馬鹿の本性なんてこんなもん
0038デフォルトの名無しさん (ワッチョイ 2964-9GzD)
垢版 |
2019/09/19(木) 22:19:21.08ID:vxcA2ILs0
すみません。
考えてもわからないので教えてください。

Dim Wb2 As Workbook
Set Wb2 = Workbooks(Range("B7").Value)

エラーメッセージ:インデックスが有効範囲にありません。

B7セルには<テストファイル.xlsx>が入っているとします。

Workbookにワークブック名を入れようとしているのですが、
なぜエラーなのでしょうか・・・?
003938 (ワッチョイ 2964-9GzD)
垢版 |
2019/09/19(木) 22:33:23.12ID:vxcA2ILs0
SetするWorkbooksは、ファイルが開いていないといけなかったんですね。
自己解決しました。
失礼しました。
004138 (ワッチョイ 2964-9GzD)
垢版 |
2019/09/19(木) 23:03:19.82ID:vxcA2ILs0
>>40
そんな書き方もあるんですね!
勉強になります。
(私のコードは無駄が多そう・・・。)
0045デフォルトの名無しさん (ワッチョイ 82ca-pIpk)
垢版 |
2019/09/20(金) 20:42:04.97ID:L83O/vz70
VBAからIEを操作してhtmlで書かれたデータを取りに行くコードを書いています

ターゲットのサイトでは、一度に20件のデータしか表示されず
一番下までスクロールするたびに20件ずつ追加されます(データは全200件です)

htmlでは、20件のデータの下に「::after」と書かれており、スクロールが一番下に近づくと
新たな20件がロードされ、その下に「::after」が現れます

質問ですが、一度に200件全てのデータを取るためにはIEでスクロールさせる必要があるように思いますが
その場合、SendKeysを使って、SendKeys "{PGDN}" のようにするしかないのでしょうか?

それとも他に、何か良い方法があるようでしたらアドバイスをいただきたくお願い申し上げます
0046デフォルトの名無しさん (JP 0H4a-tMNN)
垢版 |
2019/09/20(金) 21:06:34.17ID:oAI6ZRfWH
querytables.addでCSVファイルをエクセルシートに貼り付けたとき、グループ化で非表示にされている部分に正しく貼り付けられるのはいいのですが、グループ化非表示から表示状態にされてしまいます。
非表示部分に貼り付けつつ、非表示のままにするにはどうしたらいいでしょうか?
貼り付け先シートの元々の表示・非表示状態はそのままにしたいんですがよい方法はありますか?
0049デフォルトの名無しさん (ワッチョイ 4d91-/N/j)
垢版 |
2019/09/21(土) 12:12:30.41ID:8qwe/SJE0
>>45
ページの作りによる。
例えばあなたは20件ずつなどと言っているけど、URLの入力など次第で200件全部表示できるかもしれない。
スクロールが必要かも分からないがSendkeysなんて使うのは子供と考えて良い。
0050デフォルトの名無しさん (ワッチョイ 82ca-4A/C)
垢版 |
2019/09/21(土) 13:08:32.19ID:XrHXKxEM0
>>47>>49
レスありがとうございます。
私もSendKeysは使いたくなかったので質問した次第です

> ページの作りによる。
ターゲットサイトは、dアニメのランキングのページです。
https://anime.dmkt-sp.jp/animestore/CR/CR00000013_001

ここからランキングのデータを抜き出して来ようと思ってますが、20件ずつしか表示されず…
何かいい方法はないでしょうかねぇ
0052デフォルトの名無しさん (ワッチョイ a9ad-7RCD)
垢版 |
2019/09/21(土) 15:10:34.25ID:AFF+Wq/L0
うちの会社に、元SEでVBAバリバリ書ける、という人が
入ってきたんですが、色々Excel作業の自動化をお願いするために
現行の作業手順をお見せしたら、「ここの、Excel関数を使っているところは
意味が分からないので、関数の使い方から説明してください。」といわれ、
VLOOKUPとは、からお話ししないといけないそうで、もう自分でVBA
書こうかと思ってしまいます。
はじめはこういうもので、すぐ慣れてくれるんでしょうか?
「SEの資格」を持っている、という触れ込みの、部長の知り合いなので扱いは
要注意なのです。はぁ。
0053デフォルトの名無しさん (ワッチョイ 0279-McVF)
垢版 |
2019/09/21(土) 15:31:27.17ID:idUljkgM0
経歴詐称があった場合、解雇はできるのか

結論から言うと、解雇できる場合もあればできない場合もあります。
一口に経歴詐称といっても、軽微なものから重大なものまであり、全てのケースで解雇が可能とすることは合理的ではないからです。
解雇ができるケースは、「重要な経歴」を詐称されたときに限られます(重要な経歴とは何を指すのかは下記で説明します)。

職歴に関する経歴詐称

職歴を詐称していた場合は、採用後の仕事の内容、賃金に直接影響を及ぼすもののため、重要な経歴を詐称していると判断される可能性が高いと言えます。
判例では、グラバス事件(東京地判平成16年12月17日 労判889号52頁)があり、プログラミング能力がなかったにも関わらず、あたかもスキルがあるかのように経歴書に記載。
採用面接でもそのように説明して、ソフトウェア会社に採用されたが、経歴詐称を理由とする懲戒解雇が認められたという事例があります。
0054デフォルトの名無しさん (ワッチョイ 29d0-v5oN)
垢版 |
2019/09/21(土) 15:53:55.16ID:xM/61paW0
そもそも触れ込みから嘘だったのかまで疑ったらキリがないから、そこんとこは何とも言えないけど、
元SEが本当なら、少なくともVB(VBAじゃなく)は書けるけど、普通のオフィスワークはあんましてこなかった、とかじゃないの?
そんな感じのSEさんと一緒に仕事したことはある。ちょっと教えてあげたらあっという間に習得したけど。
でもやっぱ利用頻度の低い関数(LOOKUP系)や若干特殊な使い方(SUMPRODUCTを複数条件の判定や抽出に使うとか)には苦慮してた。
0065デフォルトの名無しさん (ワッチョイ 82ca-pIpk)
垢版 |
2019/09/21(土) 23:30:08.68ID:XrHXKxEM0
>>60
> スクロールしないで取得したかったんだが解析面倒で断念。
> https://pastebin.com/V7S3XW71

おお、わざわざここまで!
大変お手数をおかけすることとなってしまい、申し訳ないやら嬉しいやら…ありがとうございます!!

> スクロールはSendkeysではなく、HTMLWindow2のscrollToなどを使う。
最近、ネットのブログなどを参考に
見よう見まねでExcelのVBAとIE操作を両方一緒に始めたのですが…

ループで200項目取り出すまでの条件の書き方、スクロールの書き方、すごく参考になります!
ランキングデータの取り出し方…、ここまでシンプルに書けるものなんですね!!

恥ずかしながら、まだオブジェクトとかコレクションとかアイテムとかがごっちゃになってて頭で整理できておらず
文法エラー(?)の嵐に悩まされつつコードを書いてる段階で…"ChildNodes"とかもまだ使ったことないです…

本当に感謝です。
0066デフォルトの名無しさん (ワッチョイ 298e-l2za)
垢版 |
2019/09/21(土) 23:32:05.21ID:JIxctC3M0
また幼稚なゆとり世代馬鹿か
0069デフォルトの名無しさん (アウアウウー Sa85-+KEk)
垢版 |
2019/09/22(日) 17:53:07.62ID:7ea+dVk1a
>>68
VBAでそのへんを正しく理解するのはまず不可能だしその必要もないから、定型句だと思って暗記しなさい
ちゃんと理解したかったらJavaのようなきちんとしたオブジェクト指向言語を学ぶことをお勧めする
0071デフォルトの名無しさん (アークセー Sx51-uljG)
垢版 |
2019/09/22(日) 19:59:23.95ID:hXw+7SRax
>>68
一番目の式の方は、"A1".Offset(0, 12)という表現がVBAの構文上無効で何も値を返さない式になっている
なので、参照先のセル範囲の名前をバリアント型の引数として要求しているRangeプロパティ式の評価に失敗してしまい、Rangeオブジェクトの取得にも失敗する

文字列や数値のリテラルに.(任意の値)と続けて何らかのオブジェクトにアクセスしようとしても、そもそもそのようなアクセスルールが定義されていないので当然失敗する

反対にRange("A1").Offset(0,12)の方は構文上無効な表現がなく、RangeオブジェクトのメンバのOffsetプロパティ式を正しく用いているので、Offsetプロパティを介してA1セルから12列分座標移動したセルを取得することができる
008149 (スッップ Sd22-/N/j)
垢版 |
2019/09/24(火) 12:46:55.24ID:PfH2ve03d
>>80
ドラックすれば良いんじゃない?
位置調整は難しい場合があるけどウィンドウ枠の表示が変わった時に離すとドッキングするから試行錯誤してみれば良い。
0086デフォルトの名無しさん (アウアウウー Sa85-9q2I)
垢版 |
2019/09/25(水) 06:45:55.03ID:pkvL+Jrla
まじ?
エクセルやってる一般社員様がpython始めたらどうなるんだろ
0089デフォルトの名無しさん (ワッチョイ 298e-l2za)
垢版 |
2019/09/25(水) 13:51:45.80ID:uf0+2woN0
>>85
未だにこういう馬鹿がいるのか
0095デフォルトの名無しさん (ワッチョイ e77c-3Qav)
垢版 |
2019/09/26(木) 20:28:04.65ID:aKtMMU310
何も載らないよ
Excel自体クラウド上で使うようになってきてるから
マクロみたい使うならJavaScriptなのかもね
0097デフォルトの名無しさん (ブーイモ MM7f-a2LJ)
垢版 |
2019/09/27(金) 07:55:16.60ID:ccoeIvApM
ハーゲーはー ひーかーり
0098デフォルトの名無しさん (アークセー Sxbb-aWhQ)
垢版 |
2019/09/27(金) 08:22:15.68ID:RTCGxTj8x
最近はExcel操作のためにVBAを使うのはもうなんか最後の手段って感じがする
PowerQuery(M言語)、PowerPivot(DAX)、JavaScript、Python、PowerShellのどれかで書く方が楽だしメンテも簡単
0099デフォルトの名無しさん (スプッッ Sd7f-W5ZC)
垢版 |
2019/09/27(金) 08:43:34.46ID:Lnp0vM2Id
趣味が大がかりになってきて使う材料の管理が煩雑になってきたのでExcelを使って管理しようかなと考えています

工程が1,2,3…とあって、それぞれの工程で使う部材は今のところ重複はなく(今後どうなるかわからない)部材毎に色違いやグレード違い等の派生品があり、
用途としては工程毎に使う部材を別シートにリストアップしたり、規定量を割ったものをピックアップ
部材の管理番号を振るとき
番号は工程や派生に関わらず一列で一意の連番
3列で工程ー工程内の部材を連番ー派生を枝番
工程に関わらず部材毎に連番ー派生品を枝番
マクロを組むときこれらのうちどうするのがよい構造になるでしょうか?
0104デフォルトの名無しさん (アークセー Sxbb-aWhQ)
垢版 |
2019/09/28(土) 01:10:35.83ID:vqFcrTxsx
>>102
情報取得とかテーブル加工とかならVBAよりQueryTable)PowerPivotの方がよっぽど速いし型安全にデータ処理できる
数万行以上のデータのリレーション構築とテーブル加工をVBAやWorkshhet関数で実現するとか正気の沙汰じゃないぞ
0109デフォルトの名無しさん (アークセー Sxbb-aWhQ)
垢版 |
2019/09/28(土) 14:02:31.05ID:OFq3+Dp/x
>>99
一番目の方法でまず一意のIDを持つ部材のマスタを作った方が良い
その上で、派生関係や使用工程は列を分けて部材マスタの属性値として管理する
そうすれば各使用工程で使う部材を抽出するビューが漏れなく簡単に作れるし、部材データの追加も容易

何故他のやり方が良くないかというと、使用工程や派生関係を管理番号で構造的に表そうとしても、一対一の親子関係から外れる複合的な派生関係の表現が難しいし、複数の工程にまたがって使用する部材が登場した場合の付番がとても困難だから
0110デフォルトの名無しさん (ワッチョイ 878e-95m8)
垢版 |
2019/09/28(土) 16:34:58.82ID:w31BDneZ0
↑仕様もわからないのに勝手に決めつける馬鹿
0114デフォルトの名無しさん (ワッチョイ 87b0-S/NQ)
垢版 |
2019/09/29(日) 10:19:36.85ID:whL1Vznb0
今、困っていることがあり教えてください。

Excelをオープンした時に、入力規則のリストが設定されているセルに
VBAでリストにある文字列を張り付けるとリストが解除されてしまい困っています。
ただ、Excelを既にオープンしている状態であれば、VBAで文字列を張り付けてもリストは解除されません。
Excelをオープンした際の文字列貼り付けでもリストを解除しない方法、何かないでしょうか。
0117デフォルトの名無しさん (ワッチョイ 87b0-S/NQ)
垢版 |
2019/09/29(日) 13:40:07.40ID:whL1Vznb0
>>115
適当な配列を用意して、1要素に代入したい文字列を格納した後、該当セルにコピーしたが駄目でした。
もしかして、一括代入の意味の捉え方誤っていますでしょうか?

>>116
計算方法を手動にしてもdoevent挟んでも駄目でした。
入力規則の再設定は大丈夫でしたが、再設定しか駄目なんですかね。
0119デフォルトの名無しさん (ワッチョイ 87b0-S/NQ)
垢版 |
2019/09/29(日) 19:28:31.60ID:whL1Vznb0
>>118
目的は達成できるのですが、どうしてそんなことが
起きているのか気持ち悪さが残ってしまって・・・

ひとまずリスト再設定で回避してみようと思います。
皆さん、ありがとうございました。
0121デフォルトの名無しさん (アークセー Sxbb-aWhQ)
垢版 |
2019/09/29(日) 21:37:57.26ID:fy6bWXAvx
ウォッチ式で入力規則が無効になった瞬間を捕まえたらどのステップで問題が起きてるか分かるよ
あとApplication.EnableEvents=False の状態で入力規則が無効化する症状が同じように出るかどうかを確かめると良いかも
副作用あるから気を付けた方がいいけどね
0123デフォルトの名無しさん (ワッチョイ 7fdd-rP+5)
垢版 |
2019/09/29(日) 23:10:51.27ID:JC6PY5Dx0
Worksheetの表示を縮小したときに名前をつけた範囲名が青文字で表示されますが
あれを縮小表示なしに表示するメソッドとかないですかね?
なければ諦めて作ろうと思って、、
0132デフォルトの名無しさん (アークセー Sxbb-aWhQ)
垢版 |
2019/09/30(月) 21:02:52.82ID:KDJog/g4x
>>128
フォルダのフルパスがA1セルに入っているなら、

Shell Range("A1").Value, vbNormalFocus

と書けばとりあえずフォルダを開くことはできる
開いたフォルダの中のファイルを選んで何らかの操作をしたいならファイルそのものを掴む別の工夫が必要
0133デフォルトの名無しさん (ワッチョイ 7f63-S/NQ)
垢版 |
2019/09/30(月) 21:15:26.21ID:VO0MeE9M0
.Findで検索するマクロ作ってるけど死にそう
全シート検索で結合セル気にしないでいい方法ないですか
一致したの全部もれなくとるだけなのに
なんでこんな大変なんですか
0135デフォルトの名無しさん (ワッチョイ 7f63-S/NQ)
垢版 |
2019/09/30(月) 22:43:31.23ID:VO0MeE9M0
初回検索と次項目の検索が別メソッド
検索したあとに問答無用で一周して戻ってくる謎仕様
結合セル最初に見つけたら2週目で見つけられなくて死亡
最初から検索しようとしたら最初の次のセルから開始という超絶理不尽仕様
最終セル開始点にしようとしたら最終セルが結合セルで死亡
0137デフォルトの名無しさん (ワッチョイ c72d-SlO0)
垢版 |
2019/09/30(月) 23:15:22.35ID:fjb3wiBS0
あるシートから10000行程クリップボードにコピーして別シートに行挿入する事を10回程度繰り返すマクロがメモリ不足で停止してしまいます。
エクセルは32bitですがメモリ使用量は2.5GB程度、使用率は80%程度なので余裕はあります。
コピー&挿入だけでこんなにメモリ食うのは想定外だったのですが何か良い対策ありませんか?
クリップボードを使ってる理由は書式もコピーしたいからです。
0138デフォルトの名無しさん (アークセー Sxbb-aWhQ)
垢版 |
2019/10/01(火) 00:40:37.46ID:1yOvNLR5x
>>137
結合セルがない場合で、書式が行列で統一的に構造化されている(=手動でランダムに設定された書式がない)場合の話だけど、セルの値のコピーはクエリテーブルを使い、セル書式はスタイルとして登録しておいて値をコピーしたあとにテーブル単位で適用するようにする

それができないなら常套手段的な対策として、描画停止、セルの自動計算の無効化、一度のコピー行数の抑制、コピーする情報の量の削減(列を減らす、セルに入れる値の文字列長に上限をつける等)をやるしかない
0139デフォルトの名無しさん (アークセー Sxbb-aWhQ)
垢版 |
2019/10/01(火) 00:48:34.75ID:1yOvNLR5x
>>135
検索対象のセル範囲でループを回して、MergeAreaプロパティから取得できる結合範囲の第一セルの値に対してInStr関数でチェックをかけるほうが簡単に実装できる
一度触った第一セルをDictionaryに突っ込んでおけば重複回避の処理も簡単に書けるし
0143デフォルトの名無しさん (ワッチョイ e77c-e8W8)
垢版 |
2019/10/01(火) 23:46:40.82ID:SJOrrfFy0
vbaできる人は何歳くらいの方が多いのですか?
0144デフォルトの名無しさん (ワッチョイ 87f1-a2LJ)
垢版 |
2019/10/01(火) 23:51:07.99ID:0MgRI3uB0
100才。
きんは100才100才。ぎんも100才100才。
もう死んじゃいましたけど。
0145デフォルトの名無しさん (ワッチョイ 87f1-a2LJ)
垢版 |
2019/10/01(火) 23:51:51.43ID:0MgRI3uB0
いまは中曽根元首相が100才だよ。
0147デフォルトの名無しさん (ワッチョイ 87f1-a2LJ)
垢版 |
2019/10/02(水) 16:36:11.08ID:2/U5/wmB0
100才くらいなら健康でも1年後にもまだ生きてる生存率は50%くらいだよな。
そろそろ死神のお迎えがくるかな。
0149デフォルトの名無しさん (ワッチョイ 5f63-S/NQ)
垢版 |
2019/10/02(水) 23:17:24.03ID:gSiaZ46v0
直せるものもろくに直さず
超絶くそのまま世界で最も使われる言語の一つになってしまったVBAに
いろいろ思うところがある

俺らがああしろこうしろと習ってることってどこまで本当なのか
0151137 (ワッチョイ 3d2d-PFwD)
垢版 |
2019/10/03(木) 05:35:40.04ID:GiO0wfXg0
>>138
>>141-142
細かくコピペするよう変えたのですが、今度はメモリを3.5GBくらい使い始めました。
さすがにおかしいので調べた結果、コピー元のシートの1つがバグってたようです。
現在はメモリ使用量が250MB程度に収まりました。
ありがとうございました。
0152デフォルトの名無しさん (オイコラミネオ MMb5-shqV)
垢版 |
2019/10/04(金) 08:52:18.52ID:D6R1G7QwM
質問させてください。
シート上に簡単なHTMLを表示させたいのですが、そのようなコントロールはありますでしょうか?

必要なタグは、br font(color属性のみ) bold div(改行の代わり)くらいです。

目的としては、WEBデータベースに登録されているリッチテキストフィールドをダウンロードして表示することになります。
危ないタグはWEBサービス側で排除されていると思います。
0168デフォルトの名無しさん (ワッチョイ b501-Qh1z)
垢版 |
2019/10/05(土) 22:49:37.62ID:cygEmLxv0
特定フォルダの中のファイル名を取得したくて、A1にファイルパスが書いてあってあったとき
Dim fname As String fname = "DirSample.xlsx" 
の"DirSample.xlsx"の部分をA1のパスにしたいのですが、どうやった良いですか?
0171デフォルトの名無しさん (オッペケ Srbd-ckhU)
垢版 |
2019/10/06(日) 01:50:18.38ID:yv4ZtA4Er
>>5
このQueryTablesなんですけど、セル内改行を含むCSVを読み込むにはどうしたらいいですかね?
改行コードをいじってみたりしたけど駄目でした
0172デフォルトの名無しさん (ラクペッ MM65-CrRW)
垢版 |
2019/10/06(日) 08:08:24.51ID:eVUjMqzVM
>>171
CSVで「セル内改行」?
意味が分からん
0176デフォルトの名無しさん (アークセー Sxbd-2RUv)
垢版 |
2019/10/06(日) 13:10:14.83ID:H1C9JflMx
>>171
QueryTableをコード内でAddするんじゃなくて、予めPowerQueryでセル内改行の処理を埋め込んだ接続を作っておいて、コード実行時にデータの読み込みとテーブル出力だけすればいいんじゃないの
0177デフォルトの名無しさん (オッペケ Srbd-ckhU)
垢版 |
2019/10/06(日) 21:50:03.52ID:yv4ZtA4Er
>>174
セル内改行をLFにしたり色々試したんですけど駄目でした
結局一時ファイルを作って開いてからコピペという泥臭い処理に…
0178デフォルトの名無しさん (オッペケ Srbd-ckhU)
垢版 |
2019/10/06(日) 21:50:35.79ID:yv4ZtA4Er
>>176
PowerQueryですか
調べてみます
0179デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/06(日) 22:04:38.99ID:lVV4IJR90
VBAある表のデータで行と列が一致する列の値を返すコードを書きたいのですがどうしたらいいでしょうか?
行だけならVLOOKUPで行けると思うのですが列になるとどうしてラいいのかわかりません。
該当するセルの値を返したいです。
0181デフォルトの名無しさん (アークセー Sxbd-2RUv)
垢版 |
2019/10/06(日) 22:28:18.73ID:H1C9JflMx
>>179
行と列が一致するってどういうこと?

行インデックスと列インデックスが一緒ってこと?

それとも、行と列を特定するための条件が個別にあって、それらの条件を満たすってこと?
0184デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/06(日) 23:02:28.07ID:lVV4IJR90
>>181
後者です。
シートに参照する表がありユーザーフォームで作った入力表がコンボボックスとなり
一つ目のコンボボックスが行とリンクしていて、二つめのコンボボックスが列と連動して言いて
行と列の一致した値をテキストボックスに表示させたい。
一つだけならVLOOOKUPでできるのですが表となると私の力だと全く思い浮かびません。
力といってもちょっと基本がわかって参考書とインターネットの中から使えそうなコード
を引っ張ってきて使えるように修正するくらいで一から工程を考え出す事は難しいです。
0185デフォルトの名無しさん (ワッチョイ b501-Qh1z)
垢版 |
2019/10/06(日) 23:09:13.37ID:ZjSVYIsg0
ワークシートのchangeプロシージャで
A1:F5  A6:E6 A7:I105  に変更が加わったとき Range("F6") = Date をさせたいのだけど

If Intersect(Target, Union(Range("A1:F5"), Range("A6:E6"), Range("A7:I105"))) Is Nothing Then

ではうまくいきません。どなたか教えてください。

あと、セルに文字を入力するとき、対象となるセルを選択し、文字を入力したら、別のセルに入力途中の文字が表示され、Enterをおしたら対象となるセルに反映されました。
これもどうしたら普通通りになりますか?
0186デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/06(日) 23:14:57.48ID:lVV4IJR90
>>183
しいて言うならVLOOKUPとHLOOKUPの合わせる感じ?
0189デフォルトの名無しさん (ワッチョイ ea2c-2rUB)
垢版 |
2019/10/06(日) 23:45:57.04ID:ddN6wFVd0
Ruby では、2次元配列[ 行 ][ 列 ]で、そのセルを指せる。
ただし、行列のインデックスは、0 から始まる

require 'csv'

str = <<"EOT"
1,a,x
2,b,y
EOT

p table = CSV.parse( str )
#=> [["1", "a", "x"], ["2", "b", "y"]]

p table[ 1 ][ 2 ] #=> "y"
019249 (ワッチョイ 7991-rYlP)
垢版 |
2019/10/07(月) 13:22:02.42ID:paP7R7pw0
>>177
まず考えるべきはバイナリエディタで該当ファイルを開いて、どういう構造になってるのかを確認することだよ。
0196デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/08(火) 00:24:14.75ID:HDWpL7A50
〉〉184です。教えてもらった通りVLOOKUPとマッチ関数で作ってみたのですが
うまく言いません。通常のエクセルの状態ではやりたいように動作したのですができればVBAで動作できるようにしたいです、

Sub 行と列()
Dim tateya As String
Dim gouki As String
Dim gouki2 As String
Dim siriaru As String
Dim test As Worksheet
Set test = Worksheets("テスト")
tateya = test.Range("a1")
gouki = test.Range("a2")
haihhun = "-"
gouki2 = tateya & haihhun & gouki '号機
Dim siri As Worksheet
Set siri = Worksheets("シリアル管理")
Dim hanni_seru As Variant '範囲指定はバリアント型を使用する事
hanni_seru = siri.Range("D1:L39")
'VLOOKUP(列の条件,A1:D5,MATCH(行の条件,A1:D1))
siriaru = WorksheetFunction.VLookup(gouki2, hanni_seru, WorksheetFunction.Match("H1", "D1:L1"))
MsgBox siriaru
End Sub
0197デフォルトの名無しさん (アークセー Sxbd-2RUv)
垢版 |
2019/10/08(火) 02:02:42.66ID:l+0JwRkcx
>>196
たぶんMatchの行条件がおかしいけど、どんな問題が起きてるのか分からないから何とも言えない

それから、haihhunとかsiriaruとかhanni_seruとか変数の名前がちょっと酷い
HyphenとかSerialとかとかCellとか英語をきちんと使う意識を持つのが上達の近道だと思う
0200デフォルトの名無しさん (アメ MM11-pTrw)
垢版 |
2019/10/08(火) 07:37:46.07ID:wEzHRAYiM
〉〉196です。
変数名もそんなルールが?
なんとなく日本語はよくないなーと思って自分で分かるローマ字で表記しようと思ったんですが、後ダメな理由がマッチ関数にワークシート指定してないからかと推察。後で試します。
0201デフォルトの名無しさん (ワントンキン MM7a-arkt)
垢版 |
2019/10/08(火) 07:52:03.60ID:o1U1FjwuM
無理に英語やローマ字にするくらいなら日本語でいいと思うけど
あとrangeだけじゃなくてcellsも覚えれば目的達成するんじゃないか
cellsのrowとcolumnで行と列を取得出来るからね
0202デフォルトの名無しさん (アークセー Sxbd-2RUv)
垢版 |
2019/10/08(火) 08:16:32.23ID:l+0JwRkcx
>>199
ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い

Publicにするのが嫌なら、呼び出したいPrivate Subが定義されたモジュールにコールバック用の引数付きでPublic Subを定義して、呼び出したい任意のPrivate Subを引数で指定して呼び出せるようにする
それも嫌ならクラスを作ってPrivate Subをメソッド化する

どちらもコーディングや保守の工数は大して変わらない
0203デフォルトの名無しさん (ワッチョイ 3968-G1PU)
垢版 |
2019/10/08(火) 20:03:58.77ID:XnwML2Ug0
>>202
>ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
まさにこれです!privateにしなくても出来たんですね、勉強になりました。ありがとうございました

他の方法も勉強になりました
0205デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/08(火) 21:30:26.55ID:HDWpL7A50
>>200
ありがとうございます。
コメントつけまくって分かるようにしてます。
まぁ詳しい人が見たらめっちゃくちゃで分かりにくいと思うのですが、
自分用で自分が分かればいいので動くようにして少しづつ改良していきます。
多分、めっちゃ不具合あります。
0206デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/08(火) 22:01:56.51ID:HDWpL7A50
データベースから原本のシートに転記する場合表内でのループは可能ですか?
但し、実際に転記する表の上下に題名や表題があります。
例えば1行から20行での表があり繰り返すデータが21行目なったら2ページめの1行目
にするという事は可能でしょうか?
出来なさそうなのでリストボックスで見やすく作ろうかと思ったのですが、印刷用でも
作成したいのでできるのであればご教授お願いします。

上だけなら、forの頭を指定して10番目ならfor i = 10TO 最終行
で行けると思うのですが表の最後の指定がわかりません。
forをネストすればできそうですが、それでも20番目でおわる形にする感じ?
21行目を2ページ目の1行目を指定するのは難しそう
0213デフォルトの名無しさん (ワッチョイ 9fda-OHYr)
垢版 |
2019/10/10(木) 21:48:01.84ID:5Xxw1b5M0
頑張れば何でもできるだろうな。

VBSではWindowsAPIが使えない! → 裏でこっそりエクセル起動すれば使えるじゃん。
VBAではjavascriptが使えない! → ExecuteThisJavaScript使えば出来るじゃん。

殆ど屁理屈だけど。
021649 (ワッチョイ f791-mVPP)
垢版 |
2019/10/11(金) 15:44:34.63ID:3jXa2BKX0
>>211
>>212
>>213
出来るぜ。
−応ここVBAのスレだから言うけどVBAでも全部できる。
今流行りのRPAがやってることは全部出来る。
021749 (ワッチョイ f791-mVPP)
垢版 |
2019/10/11(金) 15:50:38.03ID:3jXa2BKX0
ただ、VBSでWindowsAPIは苦肉の策というか、敬遠したい気持ちもある。
まっ、VBSが最適な話なら結局使うけどね。

VBAでJavaScriptも同様だね。
こっちの方が敬遠したい。
まずはVBAだけで何とかならないかを考える。
0236デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/12(土) 20:28:16.78ID:grx7Z1qlx
経験則から言うと、エクセルのシートを入力フォームや書類のフォーマットのように捉えてる人はRangeを使いがちで、配列やテーブルとして扱えるオブジェクトの塊だと捉えてる人はCellsを使う傾向がある
0237デフォルトの名無しさん (ワッチョイ bfad-la4p)
垢版 |
2019/10/13(日) 00:25:27.70ID:ZLXCWom40
あるリストをユーザーフォームで絞り込んでそのユーザーフォームのリストボックスに
リスト内容を表示させたいのですがオートフィルタの表示はうまくいくってるのですがリストの表示
先がうまく表示されません。どうしたらいいでしょうか?
以下がコードです
private Sub kensaku_bo_Click()
'オートフィルタによる検索
Dim ws_kiki As Worksheet
Set ws_kiki = Worksheets("機器履歴")
Dim tateya As String '建屋番号
Dim gouki As String '号機番号
Dim gouki2 As String '建屋と号機の合計のセル
Dim haihhun As String
Dim myData As Variant
tateya = ken1.Value
gouki = ken2.Value
haihhun = "-"
gouki2 = tateya & haihhun & gouki '号機
ws_kiki.Range("A1").AutoFilter 3, gouki2
Dim lastRow As Long
With ws_kiki
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 12).End(xlUp)).Value
End With
With list_ken
.ColumnCount = 12
.ColumnWidths = "50;80;50;50;50;50;50;50;50;50;50;50"
.List = myData
End With End Sub
0240デフォルトの名無しさん (ワッチョイ bff7-n5Mu)
垢版 |
2019/10/13(日) 09:49:37.23ID:EzRorSmA0
間違えたmyDataは配列か
それでもフィルター情報は乗らないね
リストボックスの.RowSourceに範囲アドレス入れて連動させる方法あるけど
これフィルターも連動したっけ?
0241デフォルトの名無しさん (ワッチョイ 1fba-7XqI)
垢版 |
2019/10/13(日) 15:30:11.40ID:8j4dObBs0
セルC5:C17に数値が入ってます(A)
セルF5:F21に数値が入ってます (B)
セルY5:Y25に数値が入ってます (C)

AとBの数値のうちCにない数値をセルO5から順番に下に抜き出したいんです

cを配列で格納するまでは出来たのですがそれ以降がわかりません
よろしくお願いします

初心者です
0247デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/13(日) 18:24:09.39ID:0JmSqCe7x
普通のCollectionや配列よりも、Cの値をKeyにしてDictionaryオブジェクトを作る発想の方がいいと思う
Dictionary.ExistsメソッドでKeyの存在確認ができるからコードが簡単になる
0250デフォルトの名無しさん (ワッチョイ f768-NJTS)
垢版 |
2019/10/13(日) 21:32:01.32ID:z6dVpON+0
連想配列の事をdictionaryって呼ぶんだっけか
すごい便利だけど、シートあるんだからシート使った方がいいんでない?と思う
二次配列が目に見えて編集し放題とか楽ちんすぎる
0258デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/13(日) 22:13:33.97ID:0JmSqCe7x
シートが可視化された配列だってのはその通りなんだけど誰でもGUIで簡単に編集できてしまう点が逆に弱点でもある
値の読み書きだけでイベントハンドラに制御が渡るからそもそも重いし
0262デフォルトの名無しさん (アウアウウー Sa5b-8cCB)
垢版 |
2019/10/13(日) 23:09:26.19ID:YeAfr+Aea
>>241
こういうこと?
Sub 検索()
Const COL_C As Long = 3
Const COL_F As Long = 6
Const COL_O As Long = 15
Dim nSetRow As Long
nSetRow = 5
Dim nRow As Long
For nRow = 5 To 17
If Not IsExistValue(Cells(nRow, COL_C).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_C).Value
nSetRow = nSetRow + 1
End If
Next
For nRow = 5 To 21
If Not IsExistValue(Cells(nRow, COL_F).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_F).Value
nSetRow = nSetRow + 1
End If
Next
End Sub
0263デフォルトの名無しさん (アウアウウー Sa5b-8cCB)
垢版 |
2019/10/13(日) 23:09:42.80ID:YeAfr+Aea
Function IsExistValue(ByVal pValue As Variant) As Boolean
IsExistValue = True
Const COL_Y As Long = 25
Dim nRow As Long
For nRow = 5 To 25
If Cells(nRow, COL_Y).Value = pValue Then
Exit Function
End If
Next
IsExistValue = False
End Function
0265デフォルトの名無しさん (ワッチョイ 9fe0-o74w)
垢版 |
2019/10/14(月) 00:48:24.78ID:2bLpiP0X0
2シートを連結する際、それぞれの各行をクラスインスタンスに代入&コレクション化してるのですが連結方法に悩んでいます

Personクラス(pID, 氏名, 名字プロパティ, 生年月日,...)→Persons.Add Personインスタンス, str(pID)
Diaryクラス(dID, pID, 作成日, 本文,...)→Diaries.Add Diaryインスタンス, str(dID)
'出力
Dim d as Diary
For each d in Diaries
if(存在チェック) then xxx = Persons.Item(d.pID).名字
Next d

現在上記のように回してますが、より楽に書けるor固いor保守しやすい...実装があれば教えて頂きたいです
現状はプロパティの予測表示がされないのが微妙に使いにくいのと、そもそもコレクションにおけるkeyの動作をよく分かっていません
0267デフォルトの名無しさん (ワッチョイ bf68-NJTS)
垢版 |
2019/10/14(月) 09:29:31.58ID:+oSE7p5I0
VBAでOPENしたファイルを引数で渡す事は出来ますか?
こんな感じで処理したいのですが、「#1」って変数では無いのでしょうか

Sub foo()
Open "TESTFILE" For Output As #1 ' Open file for output.
Call write_(#1,"content")
Close #1
End Sub

Function write_(filenumber, content)
Write filenumber, content
End Function
0269デフォルトの名無しさん (アウアウウー Sa5b-8cCB)
垢版 |
2019/10/14(月) 12:22:02.07ID:UlmNQm1da
>>267
ファイル番号は1-255の範囲で常に固定値でやるなら引数で渡さずにどこも#1でいいかと思う
FreeFileって関数があってこれは番号を任意に付番してくれるので
たとえば
Dim nNo as Integer
nNo = FreeFile
Open .... #nNo
って書くこともできる
このnNoを引数に指定してもいいかもね
0270デフォルトの名無しさん (ワッチョイ bf68-NJTS)
垢版 |
2019/10/14(月) 12:27:42.70ID:+oSE7p5I0
>>269
行けました!ありがとうございます
ナンバー記号「#」の詳細ってMSDNかどこかにありますか?

Sub foo()

Dim nNo As Integer
nNo = FreeFile

Open "TESTFILE" For Output As nNo ' Open file for output.
Call write_(nNo, "conteaasnt")
Close #1

End Sub

Function write_(nNo, content)
Write #nNo, content
End Function
0271デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/14(月) 14:39:32.50ID:aC+4aHxsx
>>265
Persons、Diariesをコレクションにしている理由は、「Person、Diaryという2つのカスタムクラスの集合オブジェクト」という意味論以外に、何か実装的な理由はあるのかな?

例えば、2つのコレクションクラスに格納するデータの型が一様でないからCollectionじゃないとリスト化できないとか、多態のためにCollectionクラスをインターフェース継承させているとか

そういう事情がないならば、Keyの存在確認手段を持たないCollectionクラスではなく、Keyの存在確認を行うExistsメソッドを持つDictionaryを使うのが実装的には楽だと思う
pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)

そもそもRemoveやAddといった基本的な機能はCollectionとDictionaryとで共通しているし、Dictionaryの方が動作も早いしね
0274デフォルトの名無しさん (ワッチョイ bf68-NJTS)
垢版 |
2019/10/14(月) 15:51:24.60ID:+oSE7p5I0
>>272-273
あれ、じゃあなんでしょうねこれ
コンソールで
?#1
ではエラーになるので、ただの数値ではなくなるみたい
#1=2
も出来ない。なんとなくリテラルか参照っぽいですが、何でしょうね
openなどの時にしか使えないのでしょうか
0275デフォルトの名無しさん (ワッチョイ 9fe0-o74w)
垢版 |
2019/10/14(月) 15:54:12.83ID:2bLpiP0X0
>>271
ありがとうございます
コレクションを選択した理由は特にありません
(あえて挙げるなら、コレクションにまとめるリファレンスが最初に目に付いた です)

>pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)
言葉足らずですみません。Diaryクラス側ではpIDが重複しdIDが主キーとなるので、一意に取得できません。(この認識も間違っていたらすみません...)
エラー処理がExistsで済むのは明確なメリットですね。Collectionでは、調べた限りではOnErrorGoToで飛ばす方法しか見つけられませんでした
ひとまず、Diary側のループで取得したpIDでPersonDictionaryにExistsをかける 方法を試してみようと思います。
0278デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/14(月) 17:26:42.75ID:J7mWSp9Bx
>>275
複数のDiaryインスタンスが共通のpIDを持つならば、連結を二重化したらいいんじゃないだろうか

まずpIDをキーとするDiary用のDictionaryをまず作っておいて、
同じpIDを持つDiaryインスタンスをまとめたDictionaryかCollectionをItemとして持たせる形にすればいいと思う

構造的に表すと
(Key[i] = pID, Item[i] = (Key[j] = dID, Item[j] = Diary))

みたいな感じ
0279デフォルトの名無しさん (ワッチョイ bfad-la4p)
垢版 |
2019/10/14(月) 22:48:09.17ID:PwgP8aUB0
VBAで表からその左の行を検索したいのですがどうしたらいいでしょうか?
Dim rng As Range
Set rng = ws_siriaru.Range("D:L").Find(ken4, LookAt:=xlWhole)
If rng Is Nothing Then rng
MsgBox ""ない
Exit Sub
End If
siriaru = Range("C" & rng.Row).Value
gouki = siriaru
label_siri = gouki
では表示はされるのですがうまくいきませんでした。
0280デフォルトの名無しさん (ワッチョイ 9fe0-o74w)
垢版 |
2019/10/14(月) 23:16:54.59ID:2bLpiP0X0
>>278
重ねてありがとうございます。

なるほど。Dictionaryの各要素を、そのkeyに対応するインスタンスの集合とするんですね
1key対1レコード という考えしか無かったので目から鱗です
0282デフォルトの名無しさん (ワッチョイ 9fe0-o74w)
垢版 |
2019/10/15(火) 00:02:27.41ID:0b9bW6T40
>>279
どういった表示がされて、実際に欲しい情報とどこが違うでしょうか?

Range("D:L")をken4で完全一致検索をかけ、最初に見つかったセルの行番号を取得
その行のC列セルの値をsiriaruに代入

という点ではプログラムに間違いはありません
0283デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/15(火) 00:30:22.92ID:i09LlRYux
>>280
その通り
そのようにすれば、Diaryのインスタンス集合全体に対してpIDの存在確認をすることも出来るし、pID, dIDという2つのプロパティ値を使って目的のDiaryオブジェクトを取り出すこともできる
0288デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/15(火) 21:28:52.40ID:NB8YI5GFx
>>287
Variant型は便利だけどRangeオブジェクトを突っ込むためだけの変数で使用するにはねぇ
実際のデータ型を明示しないぶんコードが読みにくくなるしコーティング時にインテリセンスも利かなかったりとデメリットの方が目立つ
実行時エラーの原因って感じ
0289デフォルトの名無しさん (ワッチョイ bfad-la4p)
垢版 |
2019/10/15(火) 22:36:34.14ID:LwOOuMgG0
リストの表示について
以下の表示の際最終行後ろのセルが空白だった場合最終行が表示されません。
なぜでしょうか?
LastRowではA列の最終行を指定しているので間違いではないと思うのですが
最終行のみ全てのセルに数値を入れていないと最終行に反映されないみたいです;。
With ws_kiki
    LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 13).End(xlUp)).Value

End With
With list_ken
.ColumnCount = 13
.ColumnWidths = "20;60;50;50;50;70;70;50;50;50;50;50"
.List = myData
0291デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/15(火) 23:33:50.79ID:NB8YI5GFx
>>289
あなたsiriaruの人でしょ
もういい加減お金払って誰かに教えてもらうか、MSDNのVBAのリファレンスを読み込んできちんと勉強すべきだとおもうよ
会社で使ってるマクロのコードベタ貼りしてるのも本当に宜しくない

今回の問題は、せっかくLastRowにA列の使用セルの最終行の行インデックスを格納しているのに、myDataに入れる値のセル範囲指定でそのLastRowの値を使っていないことが原因でしょ
自分の頭をちゃんと使って書いてる?

myData = .Range(.Cells(1, 1), .Cells(LastRow, 13)).Value

と書き直せば終わり
0295デフォルトの名無しさん (ワッチョイ 9f4f-aOdU)
垢版 |
2019/10/16(水) 07:23:15.57ID:Qp+et4KT0
.Net系もやってる人に質問です
列挙体に属性付けて指定すると数値の他に定義した文字列返す方法があると思うんですけど
アレをVBAで行う方法は有りますか?
Constで定義すれば出来ないことは無いんですがなんかダサくて・・・
0299295 (ササクッテロ Spcb-aOdU)
垢版 |
2019/10/16(水) 12:54:37.89ID:swoRisr+p
>>296
そのためにクラスを作るとVBAの場合はひとクラス1モジュールファイルを切らないといけないし、
フォルダ分けも出来ないので、クラスを作る方法は後々クラスファイルが煩雑になる可能性があるのでやめておきます。

構造体や配列を使うのは少し大掛かりな気もしますが、お陰で何となくイメージがわきました。
DictionaryとかCollectionとかのValueペアのオブジェクトを使って、key側にenumで使用している番号、
Value側に文字列を設定して、enumに紐付けてやるような感じでやろうかなと。
ただ、修正が入るときに手間が掛かるようだとあまり意味がないのでその辺の構成は気をつけて作るような
感じですかね。ありがとうございました。

>>297
どんな言語だろうと自分なりに構成を考えて作っていくのは大事だと思いますよ。
今回の件は無理して作る程のものではありませんが
きちんと部品化しておけばまた違った局面で使うことが出来るので、
自分のためにも、引き継ぐ人のためにも大事だと思います。それはどの言語でも同じでしょう。
0304デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/16(水) 22:11:30.10ID:Y2Xm51x3x
>>299
値のペアを返す参照構造を作りたいんだったらワークシートを素直に使ってハッシュテーブルで運用した方がメンテ工数が少ないのでは
ワークシートはGUI化された多次元配列なのでね
セルの値の読み書きでイベントハンドラに制御が渡るのが嫌なら別だが
0305デフォルトの名無しさん (ワッチョイ 5701-TO0X)
垢版 |
2019/10/16(水) 22:19:50.46ID:IiLmkjOX0
フィルタされたデータをシート上で複数繋がった状態で選択したとする。その場合にそれら『のみ』を取得することはできるんだろか?教えていただきたいです。
バージョンはexcel2016です。

例)
以下がフィルタされたセル。
 A1←選択
 A4←選択
 A5
上の場合にA1とA4のみを取得する。A2とA3は取得しない。
0306デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/16(水) 22:43:21.53ID:Y2Xm51x3x
フィルタ抽出されたセル範囲だけを取得したいなら、
Range("A1:A5").SpecialCells(xlCellTypeVisible).Select

の一行で終わると思う
Range.SpecialCellsプロパティが可視セルだけを返すよう、引数に列挙定数xlCellTypeVisibleを渡せばいい
Range("A1:A5")のフィルタ範囲は必要に応じて変えてね
0307デフォルトの名無しさん (ワッチョイ bfad-la4p)
垢版 |
2019/10/16(水) 23:52:50.60ID:e5YHiPLP0
>>289です。
わぉ!辛辣ですね。こちらで聞いて大分やりたいことが出来ましたので
後は自分で考えていきます。
参考書を聞きかじってインターネットからまるまるパクったコードをデバックしまくって改造
していきます。
ちなみに今回のコードは
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 13).End(xlUp)).Value
これが正しいコードでした。
myData = .Range(.Cells(LastRow, 1), .Cells(1, 13).End(xlUp)).Value
最終列の最終行を取得してたのでそこが空白だと最終列が反映されないことが判明しました
0309デフォルトの名無しさん (アークセー Sx47-vS/Z)
垢版 |
2019/10/17(木) 01:12:20.23ID:cDk85Tz1x
>>307
読んでて頭痛のするような酷い文章だな
デバックじゃなくてデバッグだろ

しかも単なるコード改変のことをデバッグとか言ってるしさ
本気でデバッグしなきゃならないときにスキルのないこういうコピペコーダーは何の役にも立たないのに
会社の資産であるコードをこんな掲示板に晒しといて何やってんだか
0311デフォルトの名無しさん (ワッチョイ 1ead-b2ak)
垢版 |
2019/10/17(木) 01:19:38.31ID:KClIintl0
>>309
会社の資産でもなんでもないけど?
1から自分で休日に作ってるんだけど?会社で使うものでもないんでw
0320デフォルトの名無しさん (ワッチョイ e36d-S3Tg)
垢版 |
2019/10/17(木) 10:14:17.57ID:V7Fv8DAn0
結局、表入力が簡単で確実なんだよな
なんつか心配がいらない
処理はpythonのほうが楽だがエクセル
ファイルのみで管理できるってことも含め
総合的にはVBAいいんだよね 雑な意味で
データと処理が一つにまとまってるんで
オブジャクト思考的ってか
0322デフォルトの名無しさん (ワッチョイ e36d-S3Tg)
垢版 |
2019/10/17(木) 10:39:10.24ID:V7Fv8DAn0
API呼び出せるんだから
大概のことはVBAでどうにか
なってしまうんだよな。小さい会社、つまり
会社の9割以上はVBA程度で
十分なんだよな まあVBAがおもちゃで
なくてはならないって立場は分からんでもないがw
0323デフォルトの名無しさん (ワッチョイ 2701-Maid)
垢版 |
2019/10/17(木) 15:37:20.74ID:e7g1u0+T0
エクセルの表から始まる作業ならVBAがいいとおもうよ
例えば客からの電話注文をエクセルに一度まとめていて、それを管理画面に反映させる作業とか・・・
スクリプトを動かす必要のないサイトならブラウザ開かずにボタンポチで完了するし
(いつもちゃんと登録されてるのか不安がられるが)
0326デフォルトの名無しさん (ササクッテロ Sp47-F9Df)
垢版 |
2019/10/17(木) 18:09:32.12ID:p8i0Yvjup
まぁVBAやって育ってくるとその内
VB.Netとかやるようになって
Web系を扱うようになると
ASP.Netとかやる機会も出て来るから
SQLと同じようにHTMLとかCSSとか
JavaScriptとか必要に迫られて
片手間で覚えるようになるから大丈夫。

別に今のままで良ければそのまま
VBAやってればいいわけだし。
0327デフォルトの名無しさん (ワッチョイ 9f94-vCPd)
垢版 |
2019/10/17(木) 19:58:00.62ID:EDPspb6d0
VBAの最大のデメリットは何でもVBAでやろうとする脳になる事
こんな化石のような言語でやるのは苦行そのもの
今更覚える意味すらない
0329デフォルトの名無しさん (ワッチョイ 9ec6-GDtP)
垢版 |
2019/10/17(木) 20:41:45.44ID:j32AuqLC0
>>322
さすがにエクセルで納品ってわけにいかないから
適当にインターフェースつくるが中身はVBAで
十分ってのはあるな

>>327
そんなに言語仕様クソか?
小綺麗にまとまってると思うけどな
純粋さはないが使い勝手は悪くない
0330デフォルトの名無しさん (ワッチョイ f335-S3Tg)
垢版 |
2019/10/17(木) 20:55:38.52ID:a6vhi3mO0
時代遅れ感があるのと、どう書くべきかが分かりにくいのと、エラーメッセージがクソなのを除けばそこまででもないな
シートモジュールやブックモジュールが邪魔すぎる。標準モジュールだけで良かった
そしてエラーメッセージの「修正:式」はあまりに不親切。ここはアップデートかけてくれてもいいのに
0332デフォルトの名無しさん (ワッチョイ 92da-GDtP)
垢版 |
2019/10/17(木) 21:18:35.64ID:uSN2w5EG0
>どう書くべきかが分かりにくいのと

それは言語の問題じゃない。

英語の文法はわかりにくい → そりゃお前が日本人だからそう思うだけだろ!
日本語の文法はわかりにくい → そりゃお前がアメリカ人だからそう思うだけだろ!
0336デフォルトの名無しさん (ワッチョイ f335-S3Tg)
垢版 |
2019/10/17(木) 23:08:12.09ID:a6vhi3mO0
そう、オブジェクトが何か分かっていれば何の問題もない
しかし現実問題、Excelを使うのは一般事務。setっていつ使うのかなかなか理解できない層が中心なのだ
0337デフォルトの名無しさん (アークセー Sx47-vS/Z)
垢版 |
2019/10/17(木) 23:49:25.80ID:lelQayoPx
implementsステートメントで組み込みのワークシートオブジェクトのインターフェースを継承すればシート用モジュールになります、って感じの仕組みならよかったよな
ユーザー定義クラスだって属性宣言を先頭に持って来ればクラス用モジュールになりますって感じの扱いで良かったし
0344デフォルトの名無しさん (ササクッテロル Sp47-5sgQ)
垢版 |
2019/10/18(金) 12:32:43.64ID:xgSV8V5dp
>>343
そんなこと言わんと
VBAをとっとと卒業してC#辺りに入りなさいな。
他の言語も勉強するとVBAのコードの組み方もガラッと変わるよ。

例えば.Net系をやればクラスやインターフェースの理解がグッと深まるから
テスト項目も減らせる組み方が出来るし、変更点の改修も少ない組み方が出来るようになる。
0349デフォルトの名無しさん (ワッチョイ f345-UkKt)
垢版 |
2019/10/18(金) 14:34:31.34ID:C4vTbpVj0
2つ質問させてください

Sub Main()
Dim n As Long
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws1cell As Range
Dim r As Long
Set ws1 = Worksheets(1)
Set ws2 = Worksheets(Worksheets.Count)
n = ws1.Cells(Rows.Count, 5).End(xlUp).Row + 5
For r = 1 To ws2.Cells(Rows.Count, 5).End(xlUp).Row
Set ws1cell = ws1.Range("E:E").Find(ws2.Cells(r, 5).Value, lookat:=xlWhole)'項目名が違い、達成率が100%でない場合は開始日・終了日・達成率を更新
If ws1cell Is Nothing And ws2.Cells(r, 10) < 1 Then
ws1cell.Range(ws1.Cells(n, 8), ws1.Cells(n, 10)).Value = ws2.Range(ws2.Cells(r, 8), ws2.Cells(r, 10)).Value
n = n + 1
Else'達成度が進んだ場合は開始日・終了日・達成度を更新
If ws1cell.Value = ws2.Cells(r, 5).Value And ws1cell.Offset(0, 3) < ws2.Cells(r, 8) Then
ws1cell.Offset(0, 3) = ws2.Cells(r, 8)
ws1cell.Offset(0, 4) = ws2.Cells(r, 9)
ws1cell.Offset(0, 5) = ws2.Cells(r, 10)
End If
End If
Next r
End Sub
項目名が違う時にエラーが出てしまいます
If ws1cell is nothingの部分で変数を解放しているから問題なのかと考えていましたが、ws1cell = "" , 0に書き換えてもウォッチウィンドウで見ると
set ws1cellを通った後もnothingのままになっていました
setを通れば変数を定義出来ると思っていたのですが、どのようにすれば解決できますか?
よろしくお願いします
0350デフォルトの名無しさん (ワッチョイ f345-UkKt)
垢版 |
2019/10/18(金) 14:35:51.85ID:C4vTbpVj0
改行エラーが出てしまったため2つに分けました
VBAを使い始めて1ヶ月弱なのですがC#でエクセルを操作出来るようになりたいと考えております
VBAで作ったプログラムを元にして、C#を学ぶ方法は無いでしょうか?
書き方が全然違うとの話を聞いたので、諦めて最初から覚えるしかないかと途方に暮れております
よろしくお願いします
0356デフォルトの名無しさん (ワッチョイ 1ef7-V+wO)
垢版 |
2019/10/18(金) 19:17:45.06ID:Kd4kiXAf0
>>349 書き直すけど
If ws1cell Is Nothing And ws2.Cells(r, 10) < 1 Then は
ws1cellがNothingのときじゃないと通らない。なのにそのあとでws1cell.Range〜とかws1cell.Offsetなんてやると当然エラーになる。
Not ws1cell Is Nothing みたいに反転させないと。
0358デフォルトの名無しさん (ササクッテロル Sp47-5sgQ)
垢版 |
2019/10/18(金) 19:38:22.84ID:xgSV8V5dp
>>350
VBAやって一ヶ月ならそのままVBAやっておけばいいよ。別に急いでるわけでもないんでしょ?

VBAやってツールの幾つかでも作って、コードがそらで書けるようになったらまずVB.Netをやる。

文法はそっくりだけど構成が違うし見たこともない命令も沢山あるから多分苦労すると思う。
でもここさえ乗り越えてしまえばObject指向の何たるかが大体解るようになるからそうしたらC#に入ればいいよ。

C#はVBA→VB.Netのときとは逆に構成がVB.Netとよく似ていて文法が違う。あと型が厳しい。
でも、ま、VB.Netを覚えてしまえばC#も7割方理解したって言えると思う。

何も手を着けてない状態なら最初からC#をやることを勧めるけど
折角VBA始めたんだから遠回りにはなるかも知れないけどそういう楽な方法もあるよ。
0359デフォルトの名無しさん (ドコグロ MMea-VRky)
垢版 |
2019/10/18(金) 20:19:32.44ID:L2N4rS5+M
それ以前に>>349
> 項目名が違う時にエラーが出てしまいます
じゃなくてどの行でどんなエラーが出てるのかを書けよ
ID:Kd4kiXAf0は超親切だからレスしてくれてるけど普通はスルーされて終わりだよ
0360デフォルトの名無しさん (ワッチョイ 6f02-UkKt)
垢版 |
2019/10/18(金) 21:48:21.62ID:/2Um4idM0
>>356
条件が反対だったんですね…
If文の条件をもう一度書き直してみます
丁寧にありがとうございます

>>355
>>358
将来的にはエクセルに集約しすぎて重くなってしまっているデータを、誰でも使えるように軽くしたいと考えている位なので、まずはプログラムに慣れて行きます
プログラムの考え方だけでも次のステップの練習問題には使えると思うので、数をこなしてみます
ありがとうございます

>>359
すみませんでした
次から質問する時は気をつけます
0362デフォルトの名無しさん (アークセー Sx47-vS/Z)
垢版 |
2019/10/18(金) 23:10:26.23ID:3qufjhb3x
>>361
もっと細かく言うとDimでやっているのは定義ではなく、あらかじめ定義されたデータ型の適用を宣言してその型に適合したメモリ領域を確保することなんだけどな
未知の型を宣言するとエンジン側で型検査できずにコンパイルエラーになることを考えたら分かる
0363デフォルトの名無しさん (ワッチョイ 124f-5sgQ)
垢版 |
2019/10/18(金) 23:16:13.52ID:1ynBc/Lo0
>>360
そういう目的があるならまず覚えるべきはSQLだね
VBAだろうがJavaだろうが.Netだろうが
どの言語をやっていてもデータベースを扱う限り
SQLはまず使わないことがない。

ま、中にはEntityFreamworkなんてSQLを使わずにDBに同期してデータを
引っ張るなんて場合もあったりするけどSQLは最初の内に覚えておいて絶対損はしないよ。
0365デフォルトの名無しさん (ワッチョイ 124f-5sgQ)
垢版 |
2019/10/19(土) 00:34:54.51ID:UvKzTNAx0
>>364
そこは割り切り。
どうせどんな言語やってたってちょろっとしたツールを作るには
VBAでやった方が手っ取り早いことの方が多いんだから。
どの仕事場でも大概Excelは入っているしね。

それにVB系は癖が強いから他言語の習得を阻害するというのも
個人の適応能力やセンスによるものも大きいからちょっと何とも言えないし。

むしろ俺みたいに適応力やセンスが皆無なら
やれ構造化言語だ、object指向だ、関数型言語だって変わるたびにチンプンカンプンなところから始めるから
結局否応なくその言語に合わせることになるんだけどね。
0366デフォルトの名無しさん (ワッチョイ 6bce-S3Tg)
垢版 |
2019/10/19(土) 02:56:34.09ID:Z3LWqSJp0
.netを始める上での壁は文法や型なんかより膨大なクラスを把握することだからVBでもC#でも手間は変わらん
しかも日々増殖したり仕様が変わったりするから手に負えない
0367デフォルトの名無しさん (ワッチョイ f335-S3Tg)
垢版 |
2019/10/19(土) 05:58:33.57ID:4RrPMtib0
VBAは枯れに枯れた技術って意味で物凄い安定感がある

>>365
さすがに関数型言語はもう無いんじゃね?
一時遊びでlispやってたけどあれは頭の切り替えに難儀した。あれが業務だったら退職しますわ
0370デフォルトの名無しさん (ワッチョイ 124f-5sgQ)
垢版 |
2019/10/19(土) 06:47:40.57ID:UvKzTNAx0
うーん、なんて言うか
Microsoftが出してる言語、複数やったことがある人なら何となく知ってると思うんだけど
何か中途半端にとどめておくのが好きみたいな傾向があって、

例えばVBAや旧VB6なんかでもObject指向の概念は
取り入れてるんだけどインターフェースはあるけど
.Netでいう継承は出来ないとか

.Netでも関数型言語の概念は取り入れててlinqやrambda式が使えるけどデータ分析や機械学習が
出来ないって訳じゃないけど苦手だったり。

次に何か出るときはその変のことが統合されて
いい感じになったものが出るんだろうけど
多分次もその次に出て来る新しい概念を
中途半端に取り入れたところで落ち着くような
そんなことを繰り返すような気がするね。
0372デフォルトの名無しさん (ワッチョイ 124f-5sgQ)
垢版 |
2019/10/19(土) 07:39:52.38ID:UvKzTNAx0
>>371
何となく言いたいことは解るけど
一応パラダイム対応してるからObject指向でも書けるけど
それだけだったら他に洗練された言語いっぱいあるしやっぱり関数型色が強いしね
0374デフォルトの名無しさん (ワッチョイ 124f-5sgQ)
垢版 |
2019/10/19(土) 08:08:42.95ID:UvKzTNAx0
>>373
そうなんだよね。
よく「別言語の〜でやれば〜行で出来るのに」って
言う人がいるけどあれは違うと思う。

VBAは凄く間口が広い言語で
EXCELが有ればどこでも組める言語。
手軽だから何かをちょろっとやらせるには
非常に使い勝手のいい言語なんだよね。
特にExcelが絡んだときは。

間口が広いってことは初心者からお年寄りまで
誰にでも優しい言語だからそりゃ至らない部分も沢山あるけど
他の言語で簡単に出来る部分でExcelが苦手な部分を
どうやっていい感じに作りこんで行くかを考えるのもまた醍醐味。

例えばXNAとかでテトリス作った後でもう一回
じゃ、今度はVBAで作って見ようかなと思わせる
何かがある言語だと思う。
0376デフォルトの名無しさん (アウアウウー Sa43-r0zP)
垢版 |
2019/10/19(土) 10:54:26.76ID:CSoOYtrTa
VBAのいいところはほぼ会社のPCで普通にはいっているExcelでいろんなことができるようになることだろ
C#だなんだっていうやつは職場のPCにかってにVSとかいれていいとでも思ってるのかな
それをわかってないバカが多すぎ
0379デフォルトの名無しさん (アークセー Sx47-vS/Z)
垢版 |
2019/10/19(土) 11:43:29.38ID:ZEihazemx
ちょっとした処理のためにCOMのOfficeのGUIを起動させ続けなきゃいけないってのがVBAの最大の難点でしよ
単なるデータ整理をする環境として見るとOfficeは高機能すぎるし効率が悪い
PowerShellなんてWindows標準でSDKとCUIがインストールされてるしマルチプロセスもOKだからな
038249 (スップ Sd52-Nocg)
垢版 |
2019/10/19(土) 12:06:19.27ID:EjAyXMTtd
>>379
寧ろ、OfficeのGUIが起動してるのが前提だよ。
ExcelのファイルをどうにかしたいだけだったらVBAである必要全く無いんだから。
038349 (スップ Sd52-Nocg)
垢版 |
2019/10/19(土) 12:09:07.46ID:EjAyXMTtd
ちなみにここはVBAのスレであってExcelブックをどうにかしたいスレじゃない。
でも、なぜか競合しないのにVBAでないものを書く人が沸いてくるね。
0388デフォルトの名無しさん (スフッ Sd32-FOpr)
垢版 |
2019/10/19(土) 13:01:01.88ID:pCXt87yDd
>>373
開発職やってるが、Excelじゃなくて他の環境で作るべきではと思うようなシステムをExcelて依頼されることがよくある
Excelっていう環境が使う側にとっても手軽で都合がいいんだろう
0389デフォルトの名無しさん (アークセー Sx47-vS/Z)
垢版 |
2019/10/19(土) 13:21:58.93ID:ZEihazemx
>>388
俺は逆に発注側だけど、Excelの方が都合が良いというより、Excelしか想像できない奴に要件整理のタスクを与えて社内稟議まで通してRFP出してしまう感じ
Excelで作ろうが他のシステムで作ろうが発注側は中身が理解できないから取捨選択すらしてない
039149 (スップ Sd52-Nocg)
垢版 |
2019/10/19(土) 13:27:49.07ID:EjAyXMTtd
>>388
それあるね。
ネットワークとユーザー認証絡む奴でExcelには向かないからWebとかで作った方が良いって言ったんだけどさ、予算が無いんだってさ。
0393デフォルトの名無しさん (ワッチョイ 2701-U7Hu)
垢版 |
2019/10/19(土) 23:16:31.79ID:Ryiq5UZK0
A1セルに飛びたいブックのアドレスが書いてある(C:\test1.xlsx)環境下
test1.xlsxが開いていなければWorkbooks.Open(Filepath)で開く
test1.xlsxが開いていなければハイパーリンクで飛ぶ(2重起動しないため)
にしたいのですが、どうしてもできません。

G4にハイパーリンクをせっていしましたが、できません・・・どこが悪いのでしょうか?

Dim myChkBook As Workbook
Dim bookname As String
On Error GoTo ErrHdl
Set myChkBook = Workbooks("test1.xlsx")

'"開かれています。"
'ハイパーリンク起動G4
Range("G4").Hyperlinks(1).Follow NewWindow:=True
Exit Sub

ErrHdl:
' "開かれていません。"
(↓pas_kombetu1は設定済みで以下のマクロは実行できます。)

Dim Filepath
Filepath = pas_kom1

Dim targetWorkbook As Workbook
Set targetWorkbook = Workbooks.Open(Filepath)
0394デフォルトの名無しさん (ワッチョイ 2701-U7Hu)
垢版 |
2019/10/19(土) 23:20:25.07ID:Ryiq5UZK0
↑393です。間違えました。訂正します
A1セルに飛びたいブックのアドレスが書いてある(C:\test1.xlsx)環境下
test1.xlsxが開いていなければWorkbooks.Open(Filepath)で開く
test1.xlsxが開いていればハイパーリンクで飛ぶ(2重起動しないため)
にしたいのですが、どうしてもできません。

G4にハイパーリンクをせっていしましたが、できません・・・どこが悪いのでしょうか?

Dim myChkBook As Workbook
Dim bookname As String
On Error GoTo ErrHdl
Set myChkBook = Workbooks("test1.xlsx")

'"開かれています。"
'ハイパーリンク起動G4
Range("G4").Hyperlinks(1).Follow NewWindow:=True
Exit Sub

ErrHdl:
' "開かれていません。"
(↓pas_kombetu1は設定済みで以下のマクロは実行できます。)

Dim Filepath
Filepath = pas_kom1

Dim targetWorkbook As Workbook
Set targetWorkbook = Workbooks.Open(Filepath)
0395デフォルトの名無しさん (ワッチョイ 2701-U7Hu)
垢版 |
2019/10/19(土) 23:20:42.32ID:Ryiq5UZK0
↑393です。間違えました。訂正します
A1セルに飛びたいブックのアドレスが書いてある(C:\test1.xlsx)環境下
test1.xlsxが開いていなければWorkbooks.Open(Filepath)で開く
test1.xlsxが開いていればハイパーリンクで飛ぶ(2重起動しないため)
にしたいのですが、どうしてもできません。

G4にハイパーリンクをせっていしましたが、できません・・・どこが悪いのでしょうか?

Dim myChkBook As Workbook
Dim bookname As String
On Error GoTo ErrHdl
Set myChkBook = Workbooks("test1.xlsx")

'"開かれています。"
'ハイパーリンク起動G4
Range("G4").Hyperlinks(1).Follow NewWindow:=True
Exit Sub

ErrHdl:
' "開かれていません。"
(↓pas_kombetu1は設定済みで以下のマクロは実行できます。)

Dim Filepath
Filepath = pas_kom1

Dim targetWorkbook As Workbook
Set targetWorkbook = Workbooks.Open(Filepath)
0398デフォルトの名無しさん (アークセー Sx47-UVSK)
垢版 |
2019/10/20(日) 14:29:15.27ID:udtUjyhnx
>>395
やりたいことはこういうことかな?
処理の内容からみて、GoToでエラーハンドラに飛ばす必要はないと思う


' 開いているブックの集合に対してループを回し、順番にmyChkbookにセットして名前を調べ、test1.xlsxが見つかったらループを終了する

Dim myChkbook As Workbook

For Each myChkbook In Workbooks
If myChkbook.Name = "test1.xlsx" Then Exit For
Next myChkbook

' ループが終了した段階でmyChkbookにセットされているブックの名前がtest1.xlsxでない場合、test1.xlsxが開かれていないことを意味するので、test1.xlsxを開いてmyChkbookにセットする

If myChkbook.Name <> "test1.xlsx"
Then Set myChkbook = Workbooks.Open(pas_kom1)

' myChkbookをアクティブにしてハイパーリンクをフォローする

myChkbook.Activate
Range("G4").Hyperlinks(1).Follow NewWindow:=True
0400デフォルトの名無しさん (ワッチョイ 92ae-ZGIR)
垢版 |
2019/10/22(火) 08:37:21.30ID:Ppw3/Jpc0
プログラムじゃなくて、プログラミング言語とは…驚いた
学生の頃、友人がyaccとか字句解析とか構文解析とか言ってたが、その世界か…分からん

スーパー中学生誕生、プログラミング言語わずか数週間で開発、
U-22プログラミング・コンテスト2019 2019/10/21
https://www.bcnretail.com/market/detail/20191021_142131.html

「もっと人間にとって扱いやすい、自分の言語をつくってみたかった」。
10月20日に東京の秋葉原コンベンションホールで開催された第40回「U-22プログラミング・コンテスト2019」の
最終審査会で、見事、経済産業大臣賞(総合)を受賞した開成中学校3年の上原直人さん(15歳)は、
独自プログラミング言語「Blawn」を発表した。

IT業界の経営者など、並みいる審査員を驚かせたのは、完成度の高さはもちろんのこと、今年8月からわずか
数週間で完成させたスピードだった。
一次審査の応募期間7月1日〜9月2日に着想から開発、完成まで一人で仕上げたという。

◆C言語を使ったのは今年7月
それまでPythonを使っていたという上原さんは発表の中で、「今年の7月か8月にC++を始めたが、扱いにくかった。
もっと可読性の高い構文とメモリの安全性や速度を高めたいと思った」と、開発のきっかけについて語った。

質疑応答で審査員から、「7月にC++を使ったということは、Blawnはそれ以降につくられたということですか?」
と聞かれて、上原さんが「7月中旬に構想して構文解析を行って、プログラムを書き始めたのは8月ごろ」と答えると、
会場にどよめきが起きた。文句なしの受賞だった。

上原さんは、ほかにもスポンサー企業のデジタルガレージとサイボウズ2社の賞と、当日の模様を配信した
ニコニコ生放送の視聴者による賞など4冠を達成した。

Blawnの特徴は、型名の記述が一切不要、構文の可読性が高い、すべての関数/クラスがC++でいうところの
テンプレート関数/クラス、コンパイル速度と実行速度が速い、メモリが安全などだ。

また、Blawnの言語名は「Blue Lawn(青い芝)」からもじったもので、隣の芝が青く見えるほど、既存の言語の
不満を解消できるような良い言語にしたい気持ちを込めたという心憎い演出もあった。
0405デフォルトの名無しさん (アークセー Sx47-UVSK)
垢版 |
2019/10/22(火) 15:40:40.34ID:9HPDColwx
自然言語のルールそのままでプログラミング言語を実装するわけじゃないから日本語が曖昧云々ってのはズレてる
英語のit とかtheyとかbeだって曖昧極まりないし
0418デフォルトの名無しさん (JP 0H82-S3Tg)
垢版 |
2019/10/22(火) 21:38:55.73ID:tIwQFwn0H
Excelで、「行ごとに違う色をつけるが、1行目だけ何も色を付けない」というVBAの書き方を教えてくんさい。
0420デフォルトの名無しさん (ワッチョイ 9268-S3Tg)
垢版 |
2019/10/22(火) 21:48:09.80ID:fx5uI0000
>>418
3行目から始まる、4行ごとのsannpuru
色(65535の部分)はマクロの記録で取ってくれ
あともう少し真面目に聞いたほうが回答が尽きやすい


For i = 3 To 100 Step 4
Rows(i & ":" & i).Interior.Color = 65535
Next
End Sub
0421デフォルトの名無しさん (JP 0H82-S3Tg)
垢版 |
2019/10/22(火) 22:45:35.38ID:tIwQFwn0H
>>420
すみません&有り難うございます。

具体的な目的を書かずに適当に質問してしまったのですが、やりたいことは

1.行ごとに違う色を入れる
2.1行目だけ何もしない(色を変えない)
3.2についてはIF文を使う

なのですが、3.が上手くいきません。
*************************************************************************:
Sub xxxxxxx()

Dim i As Integer
Dim z As Integer
Dim y As Integer

z = 500 '最大行数
y = 300 '最大列数

For i = 1 To z '繰り返し処理を使い、変数は1〜500
Range(Cells(i, 1), Cells(i, y)).Interior.ColorIndex = 22 'セル範囲の指定
Next i '500行目までを22番色で埋める
For i = 1 To z Step 2 '1行飛ばしで500行目までを13番色で埋める
Range(Cells(i, 1), Cells(i, y)).Interior.ColorIndex = 13 'セル範囲の指定
Next i

End Sub
**********************************************************************↓こういう感じのIF文を入れたい
If i = 1 Then '1行目だけ何もしない
Range(Cells(i, 1), Cells(i, y)).Interior.ColorIndex = 00
Else
0422デフォルトの名無しさん (ワッチョイ 237c-HAen)
垢版 |
2019/10/22(火) 23:10:48.22ID:N/F1Z5u20
>>421
Ifにする必要がわからない
Range(Cells(1, 1), Cells(1, y)).Interior.ColorIndex = 0 を最後に入れるか、
最初に入れてForの開始行を1にしなければいいと思うんだが
上手くいかないとはどういかないの?
0426デフォルトの名無しさん (ワントンキン MM42-vsgv)
垢版 |
2019/10/23(水) 08:42:06.06ID:F6dTtsAKM
>>421
範囲内を塗るだけなら、最初のFor〜Nextはいらない。
範囲全体を22番で塗った後に奇数行に処理するのではなく、
範囲全体を13番で塗った後に偶数行に処理する、
とすれば、1行目の処理のIf文いらない。

Sub xxxxxxx()
Dim i As Integer
Dim z As Integer
Dim y As Integer
z = 500
y = 300

Range(Cells(2, 1), Cells(z, y)).Interior.ColorIndex = 13
For i = 2 To z Step 2
Range(Cells(i, 1), Cells(i, y)).Interior.ColorIndex = 22
Next i

End Sub


>2.1行目だけ何もしない(色を変えない)
っていうのは元々色が付いていたらその色から変えてはいけないって意味だよね。
そうすると
1行目を含めて塗った後、勝手にInterior.ColorIndex = 00であったとと決めつけて処理するのはよろしくない。
0427デフォルトの名無しさん (ワッチョイ 6f87-7R73)
垢版 |
2019/10/23(水) 08:44:11.12ID:u2hf1X8z0
>>422-425

有難うございます。
間違いなく、Forのところを2行目からにする方が簡潔でいいと思うのですが、無理矢理if文を入れるとするとどうすべきかを知りたかった部分もあったので、大変助かりました。
0429デフォルトの名無しさん (ワッチョイ 1ef7-V+wO)
垢版 |
2019/10/23(水) 09:28:03.44ID:zKPC6jha0
奇遇判定ならIfよりSelect Caseで分けると楽かな

Dim cngRng As Excel.Range
Set cngRng = Excel.Application.Range("A1:E20")
'範囲から上一列を除外
Set cngRng = cngRng.Offset(1, 0).Resize(cngRng.Rows.Count - 1, cngRng.Columns.Count)

Dim colorNum As Long
Dim r As Excel.Range
For Each r In cngRng.Rows
Select Case r.Row Mod 2 '行番号を2で割った余り
Case 0
colorNum = 1 '1=Black
Case 1
colorNum = 6 '6=Yellow
End Select
r.Interior.ColorIndex = colorNum
Next r
0432デフォルトの名無しさん (ワッチョイ 371a-8Pqf)
垢版 |
2019/10/23(水) 10:39:27.17ID:9YAnqBFd0
Rangeをつかってセルの範囲を指定した後に
条件を付け加えて条件に合うまで自動で繰り返し処理を行って条件通りになった時に選択セルに文字や数字を入れるにはその下にIfとかで条件を増やしていけばいいの?
0435デフォルトの名無しさん (ベーイモ MMff-CM8p)
垢版 |
2019/10/24(木) 18:18:50.61ID:uab6eG2kM
ExcelでOutlookのメールを処理することについての質問なのですが、ここのスレでよろしいでしょうか。

https://docs.microsoft.com/ja-jp/office/vba/api/outlook.items.getlast
getlastメソッドで、メールを取得するのですが、たまに取得できないことがあります。(たぶんNothing?が帰ってくる。Nothingでない可能性もある。)(メールアイテム以外でも動作確認済。)

getlastメソッドで、取得失敗した場合には5秒待機してもう一度getlastメソッドを行い、最大20回繰り返す処理にしても、たまにメールの取得に失敗します。

ログを確認すると、メールを受信した時間にエラーが起きているようでした。(自身が送信したメールであるかは未確認)

ちなみに、共有受信フォルダに対して処理を行なっています。

メールの取得がうまくいかない原因として何が考えられるでしょうか?
また対策もお教えいただければ。

よろしくお願いします。
0438デフォルトの名無しさん (アークセー Sx47-7WON)
垢版 |
2019/10/24(木) 22:19:08.24ID:k4Slgj9Ox
>>435
outlookの受信処理と競合して、完全にダウンロードされていないアイテムを掴んで処理が失敗してしまってるんじゃないかな

ActiveExplorer.CommandBars.ExecuteMso ("ToggleOnline")でオンライン/オフラインのモードを切り替えられるので、オフラインモードにしてから受信済のアイテムを操作してみたらどうかな
0443デフォルトの名無しさん (ワッチョイ e301-X3cA)
垢版 |
2019/10/25(金) 22:22:49.14ID:l2RnHcFL0
>>429
むしろ遇奇なら一行ifを使ったほうが簡潔だよ

 If r.Row Mod 2 Then r.Interior.ColorIndex = 6 Else r.Interior.ColorIndex = 1

また、「colorNum」を「r.Row Mod 2」の関数とみなせば

 Dim colorNum(): colorNum = Array(1, 6) '配列で代用
 (中略)
 r.Interior.ColorIndex = colorNum(r.Row Mod 2)

という形になる。
また、「r.Row Mod *」の除数は「colorNum」の要素数なので

 Dim modSecond as Long : modSecond = Ubound(colorNum) - Lbound(colorNum) + 1
 r.Interior.ColorIndex = colorNum(r.Row Mod modSecond)

と一般化できる。
これはIf文やSelect文と違い、colorNumを与えれば三色以上にも動的に対応出来る。

>>441
Selectメソッド使わなくてもセルに入力できるよっていう話だと思う
マクロを記録すると当然セル選択(Select)も全部記録するし、「選択してから操作する」は直感的にも正しいから、
初めてVBAを触る人はSelect必須だと勘違いしやすい
実際は「マクロが動いてる様子が見れないと不安だ」っていう人も少なからずいて、わざとSelectすることはよくある
0444デフォルトの名無しさん (ブーイモ MM1f-FIMf)
垢版 |
2019/10/26(土) 12:54:04.66ID:eBBCRY7lM
このまえ職場のITの人が
「サーバがコケた」と言ってました。
「コケた」とはなんですか?
サーバに足が二本あってその足がもつれてサーバが倒れた?
0445デフォルトの名無しさん (ワッチョイ ff38-RFIa)
垢版 |
2019/10/26(土) 15:23:13.25ID:ByENxD/q0
すいません
「いま選択しているセル(1セルのみ選択します)の中心に、
[行の先頭(Aの左端)]から[設定されている印刷範囲の右まで]
オートシェイプの罫線を引く」
、というマクロを作成し始めているのですが、
[印刷範囲の右まで] という指定はどのように記述したらよいでしょうか?

いまのところ検索しつつ手習いでこんな記述になったのですが、

Sub マクロ名()
Dim R As Range
Set R = Selection
With ActiveSheet.Shapes.AddLine(R.Left - R.Left, R.Top + R.Height / 2, [     ], R.Top + R.Height / 2).Line
End With
End Sub

[ ]の中に[印刷範囲の右まで]という意味合いを
挿入すればできるのかしらと思っています

[Aの左端]を指定するのに
[選択範囲の右までの距離から、選択範囲の右までの距離を引いたもの]で
距離がゼロになったはウフフ としているのも
「・・・他にビシッとした命令文があるんじゃないかね」と思っているので
ここもご教示いただければ幸いです
0447デフォルトの名無しさん (アークセー Sx47-7WON)
垢版 |
2019/10/26(土) 15:51:51.18ID:LZqRDs7Rx
>>445
印刷範囲はActiveSheet.PageSetup.PrintAreaで取得できる

印刷範囲の右端列のうち選択セルRと同じ行にあるセル範囲を取得するならば、こんな感じになるかな
試してないのでうまくいかなかったらごめん

With ActiveSheet
.Cells(R.Row, .PageSetup.PrintArea.Columns(.PageSetup.PrintArea.Columns.Count).Column)

End With
0448デフォルトの名無しさん (ワッチョイ 23c4-BHPo)
垢版 |
2019/10/26(土) 17:22:53.91ID:gStMXt400
列の右端左端の値を取ろうとxltoright/xltoleftを使ったやり方したんだけど、普通に値が入ってるのは大丈夫だったのだけど、計算式が入っているのはダメだった…

どうしたら計算式でも値が入ってる最終、最初の列の値を取れるのでしょう…
一応値貼り付けをしてみたけどダメでした。
0450デフォルトの名無しさん (ワッチョイ b39e-KT7O)
垢版 |
2019/10/26(土) 18:39:46.37ID:iVpeMUgw0
listviewが使えない状態でフルパスをドラッグドロップで取得したいんですが可能ですか。

vbsでバッチファイル経由でも良いのですが
excel上にマクロボタンを設置し
listviewのようにバッチファイル自体にドラッグドロップするのではなく
エクセル内にドラッグドロップしフルパスを取得したいです。

ご教示お願いします。
0451デフォルトの名無しさん (スップ Sd1f-mumX)
垢版 |
2019/10/26(土) 19:02:55.77ID:fijtr2QZd
OutlookとかVBAとかいつの時代を生きてんの?
そろそろ進もうよ
0453デフォルトの名無しさん (アークセー Sx47-7WON)
垢版 |
2019/10/26(土) 19:24:57.11ID:2Jq8ZMU0x
>>451
Office365でOutlookクライアントネイティブでマクロ実行するときもOutlook VBAが使えて便利だぞ
Excel VBAでもPowerPivotや PowerQueryみたいなモダンな機能を扱えるし何かと便利

あとVBAは古くて癖があるけど、やっぱりMS Office自体は有用だし、他言語でCOM生成したりMS Office Interopを使ったりする手間を考えたらVBAを使う手間と大差ない
0454デフォルトの名無しさん (ワッチョイ ffda-MdJ4)
垢版 |
2019/10/26(土) 21:43:16.86ID:3NuDJQUH0
【1 OSの種類         .】 Windows10
【2 Excelのバージョン   】 Excel2019
【3 VBAが使えるか    .】 はい
【4 VBAでの回答の可否】 可

ちょっと頭のおかしい感じにしてみたんですけど、どうでしょう?

Sub 猿()
 '@@@@@@@@@@@@@@@@@@
 Dim 日本脳炎, 邪教, 脳梗塞
 '@@@@@@@@@@@@@@@@@@
End Sub

Sub 呪呪呪呪呪呪呪呪()
 '死死死死死死死死死死死死
 Dim あああああああああああ
 '死死死死死死死死死死死死
End Sub
0460デフォルトの名無しさん (ワッチョイ ffda-MdJ4)
垢版 |
2019/10/27(日) 09:08:45.25ID:7A1wEn3c0
>>456
そこに書いてある Ubound(配列) + 1 ってのは、よく見かける見る例で、
ループ内で使うと思うんだけど、毎回配列の最大数調べてたら遅くならんかなぁ。
俺は a = a + 1 にしちゃうけど、変わらんか?
0463デフォルトの名無しさん (ワッチョイ 23c4-BHPo)
垢版 |
2019/10/27(日) 11:24:16.68ID:1nxyxlWe0
>>449
currentregionプロパティで下記のは可能でしょうか?

ABCDEFGHI(列名)
q 12 33 q

A〜I列の内、B〜H列内で数字がある最初と最後の列番号を取得したいと思ってます。

通常では448に書いたようにB〜H列を指定して.ENDでxltoleft/rightを使い2行と2つの変数に結果を入れる事でできたのですが、計算式だとNGだったので(どちらもH列が帰ってきました)
0465デフォルトの名無しさん (ワッチョイ cfdd-MdJ4)
垢版 |
2019/10/27(日) 13:19:15.84ID:5V6/K/A10
>>463
計算結果が数値の最初と最後の列ってこと?
xlToLeft; xlToRight; はセルが空かどうかでしか判断できないから使えないでしょ?
開始列と終了列からそれぞれなめて、IsNumeric(.value) で判定しないとダメじゃないかな。
なんかいい方法あるけ?
0467デフォルトの名無しさん (アークセー Sx47-7WON)
垢版 |
2019/10/27(日) 14:42:36.79ID:lm+G5EAgx
>>463
CurrentRegionでは恐らく無理
下のようにループを左右両側から回して調べるしかないんじゃないかな
列番号をチェックする行に含まれるセルを選択している状態という前提です


Dim RngA2I As Range 'チェック対象行のA列からI列までの範囲
Dim i As Long 'ループ用インデックス
Dim LMost As Long '左端列の列番号
Dim RMost As Long '右端列の列番号


With ActiveSheet
Set RngA2I = .Cells(.Cells(Selection.Row, 1), .Cells(Selection.Row, 9))
End With

For i = 2 To 8
If IsNumeric(RngA2I.Item(i).Value) Then
LMost = i
Exit For
End If
Next

For i = 8 To 2 Step - 1
If IsNumeric(RngA2I.Item(i).Value) Then
RMost = i
Exit For
End If
Next
0469デフォルトの名無しさん (ワッチョイ b37c-JGMk)
垢版 |
2019/10/27(日) 16:12:11.26ID:jv/fzOi30
>>463
With Range("B:H")
'最初
.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
'最後
.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
End With

値が入ってるセルが1つも無いとエラーになるから事前にチェックしておく
0472デフォルトの名無しさん (スプッッ Sd1f-mumX)
垢版 |
2019/10/27(日) 17:36:39.44ID:aJJKs/ARd
今の時代でマルチスレッドが使えない時点で終わってる
0475デフォルトの名無しさん (ワッチョイ 23c4-BHPo)
垢版 |
2019/10/27(日) 20:14:07.93ID:1nxyxlWe0
>>467
やはり両方から確認しにいくのが確実ですよね。
他の部署から来るデータで2シートだけは単純に空白と数値だけなのですが、他のファイルにある1シートだけは計算式入ってたので…

まぁ、最初と最後だけ確認してから他の作業をさせればいいので、これ参考にさせていただきます。
ありがとうございました。
0476デフォルトの名無しさん (ワッチョイ 23c4-BHPo)
垢版 |
2019/10/27(日) 20:16:11.25ID:1nxyxlWe0
>>469
数値限定なんです。
さらにその数値から●を他のシートに入力していくとかいうメンドクサイ作業も待ってるという…(そっちは早々に作りましたが)

ありがとうございました。
0482デフォルトの名無しさん (アウアウウー Sa27-wnNP)
垢版 |
2019/10/28(月) 01:11:50.89ID:DN6aA2bKa
最初からデータをDBへ入れて扱っていれば「端の値を取る」などというトンデモ要件はそもそも出てこないということだろう
業務ロジックの中でシートの右だの左だの何列目だのとシート上でのレイアウトに依存したコードが散乱するのは典型的な悪夢
0483デフォルトの名無しさん (アウアウクー MM47-BHPo)
垢版 |
2019/10/28(月) 08:44:07.27ID:ECOvCBlTM
448です。
元は手作業でやっていたのを自動化?したいとかで外の会社とかも関わってるので、DB化とかそういう話になるとメンドクサイ事になるらしいです。
自分は他から来ているので、あまり口出しできない状態。

あと、作業の行にカレンダーがあって、そのカレンダーに数字が入力されてる感じです。
なので月ごとに場所が変わったりするので…
そんなのが数百行あるので、少しでもその作業の先頭列が分かれば…と思っていたのですが…
0484デフォルトの名無しさん (アウアウクー MM47-BHPo)
垢版 |
2019/10/28(月) 08:46:00.28ID:ECOvCBlTM
>>482
確かに…
Excelで手作業だったって事もあって、項目によっては行が結合されていたりとかもあってさらにメンドクサイ状態。

そのへんなんとかしてほしいのだが、そうなると外の会社との折衝にもなるらしいのでNGっぽい…orz
0485デフォルトの名無しさん (ワッチョイ cfd2-Z4kd)
垢版 |
2019/10/28(月) 11:38:38.31ID:aHKY+muw0
プログラミングスレで聞くのが妥当か分からないけど
マクロの記録を使って「データ分析」ツールをSheet1、Sheet2....Sheet13と起動していくマクロを作ろうとしてるんだけど、どういうわけか「データ分析」で生成された表が現れるSheetと現れないシートにムラがある
規則性はないように思われる
なにかわかることありますかね
0486デフォルトの名無しさん (ワッチョイ c3b0-OGTw)
垢版 |
2019/10/28(月) 12:42:09.32ID:w6LeaWY50
Mac版でcontrol+Shift+5で%が付くようにしたのですがこの設定を元に戻すショートカットってありますか?
0487デフォルトの名無しさん (ブーイモ MM1f-DyET)
垢版 |
2019/10/29(火) 04:42:35.22ID:pjDEMxXCM
userformの選択されているcheckboxのcaptionを変数にまとめてautofilterでデータ抽出しようとしているのですがうまくいきません
ちなみにそのような方法でautofilterをかけることは可能でしょうか?
よくわかんない質問ですいませんがよろしくお願いします
0490デフォルトの名無しさん (ワッチョイ ff42-cmPQ)
垢版 |
2019/10/29(火) 17:46:30.71ID:/hC7c7vt0
単純に勤務表ってだけなら表計算でできることなのでエクセルスレへどうぞ(厳密には表計算ですら無いけど)
VBAは大雑把に言うと表計算だけでは実現でいないことをやるための技術です
0494デフォルトの名無しさん (スッップ Sd1f-Z4kd)
垢版 |
2019/10/29(火) 18:11:33.96ID:NgUa+H/Id
配列に入ってる値をセルに一個ずつ入れたいのですが、

for i = LBound(配列) to UBound(配列)
Cells(i.1).value = 配列(i)
Next i

こう書くと型が違いますとエラーになります
どうすればいいですか?
0495デフォルトの名無しさん (アウアウクー MM47-M947)
垢版 |
2019/10/29(火) 18:12:54.47ID:xRagZ8fLM
勤務表を自動で作成したいとなれば、アルゴリズムの知識がないと実装できないと思う。ナース・スケジューリング問題とか調べてみるといい。参考になる文献が出てくる。ただ、いっそのこと有料ソフトを買った方が早い気がする。
0500デフォルトの名無しさん (ワッチョイ cf8e-FPtM)
垢版 |
2019/10/29(火) 18:36:33.04ID:CZCLEAoQ0
>>489
馬鹿は死ね
0501デフォルトの名無しさん (スップ Sd1f-mumX)
垢版 |
2019/10/29(火) 18:41:35.33ID:VPqdpMYqd
エクセル以外のソフトをインストール出来ないってアホみたいな環境はソッコーで辞めた方が良い
VBAなんて将来性もないクソ言語を覚える意味は全くない
本当に他の開発環境は無理なの?
冗談だよね?
0503デフォルトの名無しさん (ササクッテロル Sp47-YkOl)
垢版 |
2019/10/29(火) 19:48:08.52ID:+Y5A9Qhrp
>>494
取り敢えずみんなが言ってる通り配列のインデックスは0から始まるし
Cellは行にしても列にしても1から始まるのでそこんとこ気をつけなければいけません。

後はセル指定する際にはブック、シートも指定しておく癖をつけておくことをお勧めします。
0504デフォルトの名無しさん (ササクッテロル Sp47-YkOl)
垢版 |
2019/10/29(火) 19:57:54.69ID:+Y5A9Qhrp
>>501
仕事場によっては、特に銀行系は
使うもの以外勝手にインストールしてはいけないところが多々有ります。

例えばJavascriptだけ使ってればいいのに
勝手にVisualStudoやTOMCATとかをインストールすると怒られるどころか
コンプライアンスの面から仕事場を退場させられる場合もあります。

EXCELは大概どこの仕事場にも入っているから
インストールしなくても使えるだけで、
当然入れてはいけないと言われたら勝手に入れるべきではありません。

むしろ「勝手にどんどん何でもインストールしていいですよ〜」なんて仕事場があったら
そこのセキュリティはどうなってるのか疑うべきと思われます。
0505デフォルトの名無しさん (ワッチョイ e394-mumX)
垢版 |
2019/10/29(火) 20:03:23.90ID:tCyp/No90
マクロを許可してる方がセキュリティ意識ゼロ
0511デフォルトの名無しさん (ワッチョイ cf8e-FPtM)
垢版 |
2019/10/29(火) 23:35:46.46ID:CZCLEAoQ0
>>502
死ね、クズ
0513デフォルトの名無しさん (スプッッ Sd1f-5/kr)
垢版 |
2019/10/30(水) 10:55:31.55ID:YKBvUaHsd
>>441
>>443
少し組める人は絶対にSelectを使わないという姿勢で組むものです。
何故なら無駄である上に速度が低下するので百害あって一利無しだからです。
しかし、ごく一部Selectしないと実現出来ない処理があります。
形式を選択して貼り付ける処理などがそれです。
それから>>443さんのおっしゃるようにユーザーに選択している場所を提示するためにわざとSelectする場合もあります。
0514デフォルトの名無しさん (スプッッ Sd1f-5/kr)
垢版 |
2019/10/30(水) 11:02:18.69ID:YKBvUaHsd
>>501
結構多いし、そもそもExcelだけでどうとでもなるから。
能力の低い奴はExcelのせいにするけど、こっちは君が対応出来ないことも出来るんだよ。

確かにどうにもならないことならその時にはじめて他のソフトを検討するけどね。
0516デフォルトの名無しさん (スプッッ Sd1f-5/kr)
垢版 |
2019/10/30(水) 11:07:13.09ID:YKBvUaHsd
>>504
勝手に入れる奴はそもそも居ないでしょ。
Excelは大概どこの仕事場にも入っているのは事実だけど、それが理由ではない。
入っていなければ最初から選択肢に無いし、このスレに書き込んでもいない。
0517デフォルトの名無しさん (ブーイモ MMe7-DyET)
垢版 |
2019/10/30(水) 17:43:14.91ID:qmgosQ7XM
>>487
>>488
Dim i As Integer
Dim n As Integer
Dim 検索値(0 To 3) As String
n = 1

For i = 1 To 4

If Me.Controls("CheckBox" & i).Value = True Then
検索値(n) = Me.Controls("CheckBox" & i).Caption
n = n + 1
End If
Next i

ActiveSheet.Range("$A$1:$J$41").AutoFilter Field:=2, Criteria1:=Array(検索値), Operator:=xlFilterValues


素人ながらにこんな感じで書いてみたのですが、こうするとチェックした項目だけでなく空白セルもautofilterもかけてしまいます。
どうしたら空白セルを除外することができますか?
0519デフォルトの名無しさん (ワッチョイ e394-mumX)
垢版 |
2019/10/30(水) 20:57:54.67ID:LQeJyD4+0
VBAのユーザーフォームはWindows98の時代で止まったまま
あれじゃあ恥ずかしいよね
0520デフォルトの名無しさん (ワッチョイ ffda-MdJ4)
垢版 |
2019/10/30(水) 21:12:32.09ID:q2N5Gpbg0
2019でファイルを開いた時に、勝手にコンボボックスのクリックイベントが発動するんだけど、何で?
もちろん、ワークブックのクラスには何も書いてない状態。
2013ではそんな事なかったと思うんだけど。
このせいで、一切編集せずに閉じようとしても、いちいち保存するか聞いてくる。
0521デフォルトの名無しさん (ワッチョイ 53ea-roNU)
垢版 |
2019/10/30(水) 21:15:30.81ID:CYvJIfr60
>>517
だいたいそんな感じですね。
以下で行けました。(Dim文、略)
Control名いじるのが面倒なので、FrameにChkBox
つっこんで回しています。

iCnt = UserForm1.Frame1.Controls.Count - 1
ReDim ARR(iCnt)

i = -1
For Each vBuf In UserForm1.Frame1.Controls
  With vBuf
    If .Value = True Then
      i = i + 1
      ARR(i) = .Caption
    End If
  End With
Next

ActiveSheet.Range("範囲").AutoFilter _
  Field:=1, _
  Criteria1:=ARR, _
  Operator:=xlFilterValues
0528デフォルトの名無しさん (アウアウクー MM47-BHPo)
垢版 |
2019/10/30(水) 21:55:52.89ID:gwpyZLjKM
ある数値が範囲(***-***)や、範囲と単体の組み合わせを、カンマで区切っているのを降順に配列に格納したいけど、なんか上手くいかないです。

全部VBAでやろうとしているから…なのかな?と思い始めてます。
それ用のシートを作って、そこに1つずつ入れてソートさせた方が簡単…なのでしょうか?
0530デフォルトの名無しさん (ワッチョイ ffda-MdJ4)
垢版 |
2019/10/30(水) 22:18:54.50ID:q2N5Gpbg0
>>527
それも見たけど、ないなぁ。
ていうか、コンボボックスが置いてあるシートがアクティブじゃなくても発動するし。

2013では、VBAでオブジェクトにフォーカスを移すと、
初回のみカーソルが見えなくなる現象が起きたと思うけど、
その対策として何かやってたりして。
0531デフォルトの名無しさん (ワッチョイ b37c-JGMk)
垢版 |
2019/10/30(水) 22:21:08.45ID:TIjegGw30
>>528
VBAでもシートに書き出してからでもどっちも大した手間は無いよ
まず範囲を1-3なら1,2,3と展開して全体をカンマ区切りだけにしてから、
前者なら配列に格納→配列の中身を降順でソート
後者ならシートに貼り付け→ソート機能使えばいい
0533デフォルトの名無しさん (ワッチョイ 23c4-BHPo)
垢版 |
2019/10/30(水) 23:11:10.26ID:iRK6fdCa0
>>529
すまん、コード会社にあるから書けないけど、やりたい事はそんな感じ。

最初にカンマでsplitして配列に入れてからfor〜nextで0からuboundで最後まで繰り返して「-」になってる範囲を数字にバラしてその間の数字を作って配列に入れ直して…

とかやってたらコードぐちゃぐちゃ、頭の中もぐちゃぐちゃに…orz
0534デフォルトの名無しさん (ワッチョイ cf8e-FPtM)
垢版 |
2019/10/30(水) 23:22:56.07ID:rL303qhu0
>>533
馬鹿には無理ってことだよ
0535デフォルトの名無しさん (JP 0Hff-Aa88)
垢版 |
2019/10/30(水) 23:42:55.97ID:+vGa/LGgH
ソートを自前で書くのは速度的にもメリット無いし作業シート用意した方がいいと思う
そういうとこで苦労するのはちょっと時間の無駄かなとも思うし
0536デフォルトの名無しさん (アークセー Sx47-7WON)
垢版 |
2019/10/30(水) 23:56:52.02ID:6F3AzkQ1x
>>533
配列を作るところまでは多分いけるんだろうけど、問題はソートなんじゃないの?
配列のソートをサポートしてる.NETのArrayListオブジェクトはVBAでも使えるので、CreateObject("System.Collections.ArrayList")でインスタンス生成してAddメソッドで配列を渡して使うといいよ
Revereメソッドを噛ませてからToArrayメソッドで再度配列化して配列変数に再格納すれば一発で降順ソートされた配列を取得できる
0537デフォルトの名無しさん (ワッチョイ 4a02-d0HK)
垢版 |
2019/10/31(木) 01:50:11.06ID:Xu0ModTh0
Excel2016/32bitで作成したマクロをExcel2019/64bitのパソコンに移動すると途中でExcel自体が落ちてしまいます
この場合、2019にしたこと、64bitにしたこと、どちらが原因と考えられるでしょうか?
0542デフォルトの名無しさん (ワッチョイ de8e-D9gH)
垢版 |
2019/10/31(木) 11:41:33.83ID:EmOHV2200
また馬鹿が来た
0544デフォルトの名無しさん (アウアウクー MM43-ppJP)
垢版 |
2019/10/31(木) 12:30:33.86ID:oEJHLRECM
533です。
結局分割をしたデータをセルに置いてソートをさせて配列に入れるコードで問題なく動きました。
ありがとうございました。
変にVBAてわ全てやろうとせずにすればここまで時間かけずに済んだのですね…orz
0545デフォルトの名無しさん (ドコグロ MM0b-+xQI)
垢版 |
2019/10/31(木) 12:42:50.28ID:H1H2bMOCM
どうせマクロ作った奴が手抜きしててエラーになったらApplication.Quit()してるとかじゃね
みんなエスパーじゃないんだからコード上げられないなら自分でチマチマデバッグしなよ
0547デフォルトの名無しさん (ワッチョイ c605-qQ6b)
垢版 |
2019/11/01(金) 00:20:58.64ID:bbcNS1Ni0
VBSスレが過疎り過ぎているのとWSHのスレが無いことから、ここでVBSの質問させて下さい。

WshShellのRunメソッドを使ってTortoiseSVNのダイアログを呼び出すプログラムを書いているのですが、引数1を入れてもウィンドウが最前面に来てくれません。
Runした後にAppActivateメソッドを使ってもだめです。誰か、解決策をご存じの方、よろしくお願い申し上げます。
0551デフォルトの名無しさん (ワッチョイ 0b7c-qp9g)
垢版 |
2019/11/01(金) 16:54:14.94ID:BenAXzvv0
こちらのページ(https://www.sejuku.net/blog/99122)に記載されている
PDFをテキスト抽出してエクセルに貼るマクロを利用したいのですが、
ファイルとフォルダのパスを固定した記述になっているため、
ベースとなるPDFファイルを選択できるようにしたいのですがどなたか教えていただけないでしょうか。
↓のアスタリスク部分をどうにかすればと2時間戦いましたがどうにもできませんでした...

'PDFのデータをExcelに読み込むメイン処理
Sub Main()
'PDFファイルをテキストに変換するための定数を用意
* Const fileName = "*****"
* Const folderPath = "C:\Users\*****\"
Const pdfFilePath = folderPath & fileName & ".pdf"
Const txtFilePath = folderPath & fileName & ".txt"
'PDFファイルをテキストに変換
Call convPDFtoText(fileName, folderPath, pdfFilePath, txtFilePath)
'テキストデータをExcelに読み込む
Call importTxtData(txtFilePath)
End Sub
0553デフォルトの名無しさん (ササクッテロル Sp03-HTwX)
垢版 |
2019/11/01(金) 19:03:05.01ID:qpEsTrFRp
>>536
.Netのオブジェクトが使えるというのは
正直目からウロコだった。

いいね。.Net使いの俺からすると
機能に制限があるとは言っても有り難い。

ただ、参照設定して使っても
インテリセンスが効かないのが
ちょっと玉に瑕だけど。
0554デフォルトの名無しさん (ワッチョイ 4ada-QPqB)
垢版 |
2019/11/01(金) 19:13:41.95ID:VrCKg/E/0
>>532
試してないけど、クリック→ドロップボタンクリックにしたら発動しなくなったから、もうそれでいいやw
1クリックで2回動くのが嫌だけど。
いちいち、2回に1回Exitする処理入れないといけないし。
0560デフォルトの名無しさん (ラクペッ MMfb-KqWR)
垢版 |
2019/11/02(土) 17:21:27.20ID:ZDwGDXirM
>>557
CreateObjectせず使う方法があるのか
0570デフォルトの名無しさん (ワッチョイ 1bc4-5gQh)
垢版 |
2019/11/03(日) 04:16:21.62ID:C9sdk88g0
ユーザーフォームが表示されてる状態でキーボードのキーの組み合わせ(ctrl+何かとか)をした際にだけ、フォーム上に表示される様にするにはどう言ったコードにすればいいでしょう?
0571デフォルトの名無しさん (アークセー Sx03-9ZEm)
垢版 |
2019/11/03(日) 05:12:05.86ID:dj0payfvx
>>570
UserFormのKeyDownイベントで拾う
たとえばUserFormの上でCtrlキーとAキーが同時に押されたときにCommandButton1を表示するという処理なら下のようになる
押された文字キーを示すキーコードは引数KeyCodeに定数で格納されるけど、Aキー以外の文字キーにしたいなら定数は自分で調べてくれ
あと次からは何を表示したいのか目的語をきちんと書くように

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = 65 And Shift = vbCtrlMask Then Me.CommandButton1.Visible = True

End Sub
0576デフォルトの名無しさん (アークセー Sx03-9ZEm)
垢版 |
2019/11/03(日) 13:54:04.03ID:dj0payfvx
逆にWithステートメントで取得した参照がEnd Withまで静的に保持される点は注意すべきポイントでもある

例えばWith ActiveSheet で始まるWithブロック内で他シートをアクティブにしても、ドットでアクセス提供されるメンバの親はWith宣言時点のActiveSheetになるからな
0577デフォルトの名無しさん (ドコグロ MM02-l9Pq)
垢版 |
2019/11/04(月) 01:41:27.33ID:uMNIwQlPM
Withの読み方はウイズだと思うけど書くときの頭の中はいつもウイテンなのは俺だけなのかな
0584デフォルトの名無しさん (ワイーワ2 FF82-Se/k)
垢版 |
2019/11/05(火) 18:34:38.01ID:CrKvYzfVF
DataObjectオブジェクトについて https://chiebukuro.yahoo.co.jp/

0OM
0585デフォルトの名無しさん (ラクペッ MMfb-KqWR)
垢版 |
2019/11/05(火) 18:44:36.75ID:v4Zm9Tj+M
>>581
20年以上ファルスと読んでた。最近Youtubeでフォルスだと知った。Bluetoothを何度教えてもブルースと読む同僚を笑えない。
0589デフォルトの名無しさん (ワッチョイ 6f5f-ANgw)
垢版 |
2019/11/05(火) 21:16:39.16ID:rpaa5EWu0
フォルス?フォールスだろ?
英語知らんのかな
0591デフォルトの名無しさん (ワッチョイ 6f5f-ANgw)
垢版 |
2019/11/05(火) 21:32:19.18ID:rpaa5EWu0
いや単にバカなだけだろw
0601デフォルトの名無しさん (オッペケ Sr0f-I9Tk)
垢版 |
2019/11/07(木) 00:18:34.56ID:Vgod5FHRr
すみません。
最新のWindows10でVBAを実行したところ、VBScript.RegExpのCreateObjectに失敗しました。
IEのVBS機能が無効化された影響によるものでしょうか?
回避策等ありますでしょうか?
0602デフォルトの名無しさん (アークセー Sx0f-Arvb)
垢版 |
2019/11/07(木) 03:57:12.24ID:sFRacxbxx
>>601
試してないけどJScriptを使ったらどうかな
32bit環境ならScriptControl オブジェクトをCreateObjectで生成してJScriptの正規表現を使う
62bit環境ならMSHTMLオブジェクトでIEのエンジンのJScript実行環境を生成して、そこからJScriptの正規表現を使う
0603デフォルトの名無しさん (ワッチョイ 0fcc-OQ0I)
垢版 |
2019/11/07(木) 19:03:46.63ID:JqbJgiKT0
同じフォルダ内の他のファイルを削除しようとすると
ファイルは削除されますが、
「実行時エラー'70': 書き込みできません。」
がでて処理が止まります。
Dim aa As String
aa = ThisWorkbook.Path & "\"
Kill aa & "*.*"

どうすれば止まらずに処理できますか
0604デフォルトの名無しさん (ワッチョイ 0f8e-8UzB)
垢版 |
2019/11/07(木) 19:14:00.49ID:JuEkRQF70
>>603
自分の手で自分の頸を吊ってみればわかるぞ
0611デフォルトの名無しさん (ワッチョイ 0f8e-8UzB)
垢版 |
2019/11/07(木) 20:19:39.30ID:JuEkRQF70
>>610
馬鹿は死ねよ
0618デフォルトの名無しさん (アークセー Sx0f-Arvb)
垢版 |
2019/11/09(土) 08:05:58.77ID:FLPipJw+x
>>603
Dim fso As Object
Dim fr As Object
Dim fl As Object

Set fso = CreateObject("Scripting.FileSystemObject")
Set fr = fso.GetFolder(ThisWorkbook.Path)

On Error Resume Next

For Each fl In fr.Files
If fl.Name <> ThisWorkbook.Name Then
fl.Delete
If Err.Number <> 0 Then
Debug.Print "Err.Number:" & Err.Number &" FileName:" & fl.Name
Err.Clear
End If
End If
Next fl
0621デフォルトの名無しさん (アークセー Sx0f-Arvb)
垢版 |
2019/11/09(土) 10:39:45.65ID:YT93jrBPx
>>620
そのやり方だとNASとかにある共有ファイルを他人が開いてる場合には判定不可能

>>619
対象のファイルをエクセルファイルとして開かずにVB6のOpen ステートメントの追記モードで開くのがオーソドックスなやり方
他のユーザーエンティティが編集権をロックした状態だとファイルが開けずエラーが発生することを利用する
エラーコードを調べて0より大きい場合はファイルが開かれている、そうでなければファイルが開かれていないと判断する
ただし負荷対策が最適化されていないネットワーク環境でサーバーの応答が遅くなっている場合、数分前に誰かが閉じたファイルを開いていると判定してしまうので要注意

'サンプルコード
Sub Sample()
If IsFileOpened("任意のブックのフルパス") Then
MsgBox "開かれています"
Else
MsgBox "開かれていません"
End If
End Sub

Function IsFileOpened(fliepath as String) As Boolean
On Error Resume Next
Open filepath For Append As #1
Close #1
If Err.Number > 0 Then
IsFileOpened = True
Err.Clear
Else
IsFileOpened = False
End If
End Function
0622デフォルトの名無しさん (オッペケ Sr0f-I9Tk)
垢版 |
2019/11/10(日) 03:17:05.03ID:7c8MD0U8r
>>621
ブックを開いているときは~$ファイル名の隠しファイルが作られるからそれを見たら
0623デフォルトの名無しさん (スププ Sdbf-38dS)
垢版 |
2019/11/10(日) 16:07:54.61ID:mlZHtGvXd
行番号が1-9まで1ずつ加算されてる中で3ごとにブロックとして処理の始点を1,4,7行にしたいんだけど行番号から式で求められないかな?
for i=1to9
if i<4 and i>0 then 処理1
elseif i<7 and i>3then 処理2
else 処理3
next i
これを分岐なしでスマートに書きたい
123456789→111444777って変換式が欲しい
0624デフォルトの名無しさん (ワッチョイ 0f8e-8UzB)
垢版 |
2019/11/10(日) 16:20:12.48ID:ISabdlL+0
>>623
馬鹿は小学生からやり直せ
0626デフォルトの名無しさん (スップ Sdbf-IAD9)
垢版 |
2019/11/10(日) 16:54:56.61ID:CxUi7EKzd
VBAの時点でスマートじゃないから
0629デフォルトの名無しさん (ワッチョイ dbce-DaD1)
垢版 |
2019/11/10(日) 17:46:44.80ID:f9aUABsd0
>>623
変換するだけなら
i - (i - 1) Mod 3
で111444777になる
3つの処理に分けたいなら
Select Case i
  Case 1, 2, 3
    処理1
  Case 4, 5, 6
    処理2
  Case Else
    処理3
End Select
0631デフォルトの名無しさん (アークセー Sx0f-Arvb)
垢版 |
2019/11/10(日) 17:55:48.55ID:CHmVk7q0x
>>623
111777999を割り出す変換式を使うのではなく、行番号を3で割った商が1の場合だけ処理を行うようにするのは駄目なの?
例えばこんな感じ

For i = 1 To 9
If i Mod 3 = 1 Then
'処理
End If
Next
0641デフォルトの名無しさん (ワッチョイ 4bc4-PySg)
垢版 |
2019/11/11(月) 21:20:23.51ID:ar1IlrsX0
ブックAのUserFormのボタンから1つ下のフォルダに入っているブックBのUserFormを起動させたいのだけど、
ネットで探した「Application.run Thisworkbook.path & "\〜\ブックB!subプロシージャ名"」というのを記載して実行させたけど、
エラーになってしまいましたが、これはどこが悪いのでしょう…
0653デフォルトの名無しさん (ベーイモ MM7f-tVd4)
垢版 |
2019/11/12(火) 10:11:19.95ID:n8VUgOjjM
スレチですまん。
俺はVBAをやってるが上司から言われました。(うちの部署、10名のうち、VBAを作れる人は二人だけ、、、)

AIが集計をしてくれるからEXCELは必要ない時代が来るねと言ってた。

反論出来る?
0655デフォルトの名無しさん (アウアウクー MM0f-n17R)
垢版 |
2019/11/12(火) 10:28:50.68ID:l0mUz5CNM
まぁAIが台頭してくる頃にはその上司は居ないだろうからスルーでいいんじゃない?

それかそのAIの設定?は誰がやるんだよっ!
そんな事も分からん様なヤツの方が必要なくない?ってw
0658デフォルトの名無しさん (ドコグロ MM8f-keNo)
垢版 |
2019/11/12(火) 13:51:05.18ID:kiUdBOPaM
○データフロー中に存在する、辻褄合わせのためのデータ加工
→業務フローの見直し、システムの改善、ETLツールの導入等により脱VBA
○ルールベースで実施可能な、機械的な意思決定のためのレポート作成
→完全な自動化により脱VBA
○ルールベースでは困難な、人間的判断を必要とする意思決定のためのレポート作成
→BIツール等に置き換えて脱VBA
AIを使うとしたらこの3番目だけど、そこまでいく前にやるべきことはいくらでもある
それをやり尽くしてAIの導入を検討する頃にはVBAなんかとっくに無くなってるはずだから、VBAとAIが直接競合することなんて無いよ
0659デフォルトの名無しさん (ワッチョイ 0f8e-8UzB)
垢版 |
2019/11/12(火) 14:15:36.08ID:fOVSc9po0
現在のAIが何をやってるか知らない馬鹿ども
0662デフォルトの名無しさん (ササクッテロレ Sp0f-9pxj)
垢版 |
2019/11/12(火) 23:57:00.45ID:NVQBnRcZp
構文ミスって無限ループが発生した時にエクセルが固まるやつはなんか対策ないんか?
0667デフォルトの名無しさん (ワッチョイ fb7c-t5zK)
垢版 |
2019/11/13(水) 11:30:26.61ID:0dM9Rqjm0
いつかはExcelもPCも必要なくなる時代は来るだろうけど今は必要だからな。データ管理する以上はExcel、Accessは最後まで残りそうだけどな。
将来的に事務職がなくなれば、事務管理してる上司もいらないから、新しい仕事探したほうがいいね
Pythonだけ出来ても仕事ないよ
0672デフォルトの名無しさん (ドコグロ MM3f-keNo)
垢版 |
2019/11/13(水) 15:26:24.21ID:zYuYteZMM
その時点で世の中の自称VBAプロの半数以上よりは上だと思う
世の中のVBA使いのレベルは想像を絶するほど低いから、
少しでも何が役に立つもの作れるようになったら「VBAを使いこなせます」と言っちゃっていいよ
0674デフォルトの名無しさん (ワッチョイ 9fda-AXNO)
垢版 |
2019/11/13(水) 19:26:09.82ID:YFdnwmN50
VBAエキスパートなんかあるのか・・。
VBエキスパートではなく。

トランスフォーマー検定じゃなくて、
トランスフォーマーガム検定みたいな感じか?
違うか。
0676デフォルトの名無しさん (ワッチョイ 2be5-NsPY)
垢版 |
2019/11/13(水) 19:58:58.25ID:YIACCBmB0
A列で適当な色でフィルターをかけて、B列の可視セルをC列の値✕D列の値にする場合はどうすれば良いでしょうか。
for each in specialcells(xlCellTypeVisible)
b.value=c.value*d.value
next
にしていますが、データ2000くらいあるとと遅いです。
b.specialcells(xlCellTypeVisible).value=を用いれば早くなりそうですが、よく分かりません。
分かる方いましたら教えて下さい。
0681デフォルトの名無しさん (ササクッテロ Sp0f-jIeE)
垢版 |
2019/11/13(水) 21:12:54.98ID:xS2J4sOcp
質問失礼します。
vbaからc++のdllへ引数を渡してc++で処理し、配列をvba側に返したいです。
引数で渡すものは、配列ではありません。

文字列や数値をvbaで受け取ることは出来るのですが、配列はどのようにc++から受け取れば良いのでしょうか?

お願いします。
0682デフォルトの名無しさん (ワッチョイ 2be5-NsPY)
垢版 |
2019/11/13(水) 21:45:08.38ID:YIACCBmB0
>>679
>>680
ボタンを押した時だけ変更するようにしたいので、式を入れるのは難しいかと思います。
またまた後だしになるんですが、他にも色々ボタンを配置して、このボタンを押すとB=Cとしたり、こっちのボタンを押すとB=1.1*Dという感じにしています。
0685デフォルトの名無しさん (ワッチョイ 02da-6HYk)
垢版 |
2019/11/14(木) 20:59:40.88ID:17R2nmHB0
>>682
色以外にフィルタをかけられる要素は無いの?
あるなら、一旦解除して配列に入れて、該当行だけ計算して、またセルに戻して再度フィルタ。

>>681
普通に受け取れると思うけど。
ByRef的に受け取るの?
0694微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:01:13.26ID:Owph/MuN0
「置換したい文字列」と「置換文字」を変数として扱って、全体の文字を出力することはできませんか?
Replace関数では、Replace(文字列, 検索文字, 置換文字)とありますが、
文字列の入った変数を第一引数に与えるエラーが出てしまいます。

最終的な目的として、エクセルで定型的なHTMLコードを出力したいのです。
何かよい策がありましたら教えてください。

Sub 企業情報コピーテスト()
Dim i As Long
Dim s1 As String
Dim excelldata1 As String
Dim excelldata2 As String
....
s1 = HtmlSorce.Cells(2, 2).Value
'企業名
excelldata1 = Sheet1.Cells(4, 4).Value
'資本金
excelldata2 = Sheet1.Cells(5, 4).Value
Replace(s1,"tabledata1", excelldata1)

Debug.Print (s1)
End Sub
0695微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:02:05.70ID:Owph/MuN0
■HtmlSorce.Cells(2, 2)に入っているデータ■
<table width="100%" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>企業名</td>
<td>
tabledata1
</td>
</tr>
<tr>
<td>資本金</td>
<td>
tabledata2
</td>
</tr>
....
</tbody></table>

///////////////////////////////
こんな感じです。どうぞよろしくお願いいたします。
0698微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:10:44.84ID:Owph/MuN0
すいません。できた 私はあほでした。
s1 = Replace(s1,"tabledata1", excelldata1)
で出力できました。
0699微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:11:37.38ID:Owph/MuN0
みんな、早い。。ありがとう。。
0703微動 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 11:35:29.77ID:7JpkRiZ80
わたくしのことですか??

コーディングは、いつもAtom使って手打ちしてるよ。
ただ、定期的にエクセルで入稿してくる案件があるので、
毎回エクセルからデータを手作業でコピペするのがしんどくて
コピペミスもあるし。
VBAでまるっとタグが出力できればいいなと。

他に良い方法がみあたらないし、これがベストかと。

思ってるとこでし。
0705微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 11:47:05.51ID:7JpkRiZ80
そんなこといわなくても、、、
web系は、sublimetext か Atom が多いと思う。まれに秀丸さんもいるお。
0707微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 11:52:22.26ID:7JpkRiZ80
ここらへんにいらっしゃるかたは
R列が何番目か直ぐに頭にでてくるのかしらん。

セル選択したら、行列番号がすぐわかる表示設定あるといいですねえ。
0711微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 12:46:43.50ID:7JpkRiZ80
いろいろ提案ありがとうございます。
普通に対応表を手元においときます。
0713デフォルトの名無しさん (ワッチョイ e9f1-Xz/Q)
垢版 |
2019/11/17(日) 13:37:03.64ID:3mRPp1GD0
まれに禿もいるよ
0714デフォルトの名無しさん (ワッチョイ e9d2-gqPR)
垢版 |
2019/11/17(日) 14:08:51.89ID:1WE0juC20
>>707
1行目に連番を振っておく
0722デフォルトの名無しさん (JP 0H92-iGNt)
垢版 |
2019/11/17(日) 22:37:01.66ID:8Px/zAQ8H
1行目1列目にランダムに数字が入力されている表において、その数字を上から順番に足して2列目にその合計を表示させるにはどう書けばいいでしょうか?(下みたいな感じで)

1列目 2列目
--------------------
4     4
7     11
8     19
12    31
15    46
2     48
0729デフォルトの名無しさん (ワッチョイ 6d8e-2sI3)
垢版 |
2019/11/18(月) 01:27:00.60ID:pxOyK5Ui0
>>722
馬鹿は死ねよ
0730デフォルトの名無しさん (ワッチョイ 822c-Lnqu)
垢版 |
2019/11/18(月) 04:45:54.36ID:SrAXqM1K0
Ruby で作った

nums = <<"EOT".lines( chomp: true ).map( &:to_i ) # 数字の配列。改行は削除
4
7
8
12
15
2
EOT

totals = nums.each_with_object( [ 0 ] ) {
|num, ary| ary.push( ary.last + num ) }

totals.shift # 先頭要素の0 を削除する
p totals #=> [4, 11, 19, 31, 46, 48]
0731デフォルトの名無しさん (ドコグロ MM15-dzja)
垢版 |
2019/11/18(月) 15:14:40.58ID:ScNSEd7IM
>>722
Sub sample1()
Dim i Range
Range("B1") = Range("A1")
For i = 2 To 6
Cells(i, 2) = Cells(i - 1, 2) + Cells(i, 1)
Next i
end sub

A列が不特定多数で出力の速さを求めるのなら

Sub sample2()
Dim i Range,j Range
j = WorksheetFunction.Count(Range("A:A"))
Application.ScreenUpdating = False
Range("B1") = Range("A1")
For i = 2 To j
Cells(i, 2) = Cells(i - 1, 2) + Cells(i, 1)
Next i
Application.ScreenUpdating = True
end sub
0732デフォルトの名無しさん (ドコグロ MM15-dzja)
垢版 |
2019/11/18(月) 15:19:20.54ID:ScNSEd7IM
間違えた

Sub sample1()
Dim i As Long
Range("B1") = Range("A1")
For i = 2 To 6
Cells(i, 2) = Cells(i - 1, 2) + Cells(i, 1)
Next i
end sub

A列が不特定多数で出力の速さを求めるのなら

Sub sample2()
Dim i As Long,j As Long
j = WorksheetFunction.Count(Range("A:A"))
Application.ScreenUpdating = False
Range("B1") = Range("A1")
For i = 2 To j
Cells(i, 2) = Cells(i - 1, 2) + Cells(i, 1)
Next i
Application.ScreenUpdating = True
end sub
0737デフォルトの名無しさん (ワッチョイ eecc-7HT4)
垢版 |
2019/11/18(月) 18:10:29.63ID:7QICIGub0
マクロ実行ブックと同じフォルダ内にある"CCT"というブックに
1つのシートがあって、そのシートをマクロ実行ブックの"CCT1"に貼り付けたいのですが
"CCT"内のシート名が毎回変わってしまうので、変わってもコピペができるマクロをおしえてください

Workbooks.Open ThisWorkbook.Path & "\CCT", ReadOnly:=True
Sheets("*").Cells.Copy ThisWorkbook.Sheets("CCT1").[A1]
ActiveWindow.Close savechanges:=False
0741デフォルトの名無しさん (ワッチョイ 0d7c-RQWt)
垢版 |
2019/11/18(月) 19:14:56.88ID:sS2XhUCG0
vbaを勉強してるのですが、specialcellsとusedrangeの違いが分からないのですが、どんな時に使い分けるのですか?
0755デフォルトの名無しさん (ワッチョイ e194-qxAY)
垢版 |
2019/11/18(月) 21:40:37.27ID:/hFPyym30
Rubyなら一行で書ける程度の事をVBAは面倒だね
0762デフォルトの名無しさん (オッペケ Sr11-bUGG)
垢版 |
2019/11/19(火) 22:43:20.17ID:UG4gZLw4r
>>740
RangeをVariantに代入して
For c = 1 To Ubound(Variant)
Variant(1,c)...
が一番楽
だけどRangeが1セルだけの場合上手く代入できない気がする
0764デフォルトの名無しさん (アウアウウー Sa9d-d1iG)
垢版 |
2019/11/21(木) 15:35:37.98ID:2y1jGWDSa
http://officetanaka.net/excel/vba/tips/tips38.htm

Sub Sample1()
Dim RE, strPattern As String, r As Range
Set RE = CreateObject("VBScript.RegExp")
strPattern = "SUM\("
With RE
.Pattern = strPattern ''検索パターンを設定
.IgnoreCase = True ''大文字と小文字を区別しない
.Global = True ''文字列全体を検索
For Each r In ActiveSheet.UsedRange
If .Test(r.Formula) Then r.Interior.ColorIndex = 3
Next r
End With
Set RE = Nothing
End Sub
このソースのDim REの部分ってこのサブルーチンだけを動かすようなマクロの場合いらなくね?
0765デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/21(木) 15:37:08.52ID:LUwjW7Cja
>>764
間違えたdimでRE変数宣言するのいらなくない?
それとは別の話でset RE nothingはこのサブルーチンしか動かさない場合は必要なくない?
0766デフォルトの名無しさん (オッペケ Src5-/8GO)
垢版 |
2019/11/21(木) 16:45:06.69ID:CoNvnJper
>>765
変数そのものがなくても良いって話なのか、宣言がいらないって話なのか?
まあどっちもやりようによってイエスだが、それが推奨されるかは別の話
0767デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/21(木) 17:16:22.54ID:LUwjW7Cja
>>766
プログラム的に何か考慮してるのか聞きたい
プロジェクトでどうするべきか見たいなところは興味ない
0768デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/21(木) 17:22:58.39ID:LUwjW7Cja
vbaの設計的にはSet RE = CreateObject("VBScript.RegExp") これだけで初期化できてるからdimで宣言する必要があるのかコンピューターサイエンスサイドの意味で聞きたい
0771デフォルトの名無しさん (アークセー Sxc5-dWLu)
垢版 |
2019/11/22(金) 01:53:36.59ID:NJe7bE9qx
>>768
モジュールレベルで変数宣言を強制している場合にはプロシージャ内のDimで宣言していないとコンパイルエラーになる
型指定なしのDim宣言ってのは実際にはVariant型変数の宣言なので、代入時に型評価をしているだけだけどね
RegExp型のメモリ領域をDim宣言時に確保するとなると参照設定が必要でそれはそれでまた別の問題が生じる
0772デフォルトの名無しさん (スプッッ Sd73-MY8M)
垢版 |
2019/11/22(金) 11:54:02.74ID:L6bND2U2d
クラスモジュールを使ってオブジェクト指向(厳密には違うらしいですが…)を理解したいと思っています
Newでオブジェクト生成して、get set letを使いながらプログラムを書くという認識で合っているでしょうか?
0773デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:01:14.10ID:BVLtoDL5a
>>771
モジュールレベルで変数宣言を強制している場合には必要なのね、ありがとう良くわかった。
set RE = nothingなんだけどこのサブルーチン実行完了したらメモリとか解放されるからnothingやらなくてもスタック領域占有しないと思ってるんだけど実際のところどうなの?そもそも"VBScript.RegExp"の占有ってスタック領域であってる?
そもそもVBAのこの
0775デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:16:14.12ID:BVLtoDL5a
>>774
教えてよ知ってるなら質問してたからこれも
0776デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:19:40.92ID:BVLtoDL5a
実際に正常終了する前提ならset RE = nothingしなくてもメモリリーク起きないのか知りたい
0778デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:44:22.42ID:BVLtoDL5a
>>777
やるけど"VBScript.RegExp"の占有領域はスタックかどうかだけ教えて欲しい
スタックメモリだと思ってるんだけど
0780デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 13:00:58.08ID:BVLtoDL5a
>>779
いやここVBA質問スレだよね?
その姿勢は本分を果たしてなくないか
0781デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 13:03:14.92ID:BVLtoDL5a
アインシュタイン「6歳の子供に説明できなければ、理解したとは言えない。」
0784デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 16:59:48.42ID:K4D/35s4a
>>782
小1がやってもいいだろ
例えだよね?
0785デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 17:00:31.99ID:K4D/35s4a
お前ら答えられないからって逃げすぎw
0788デフォルトの名無しさん (アークセー Sxc5-dWLu)
垢版 |
2019/11/23(土) 09:54:08.90ID:W8QCJ151x
>>773
VBScriptの正規表現オブジェクトはIE付属のエンジンだからヒープにインスタンス作成してるだろうし、参照カウンタ0になったら自動破棄されてるんじゃないの
このサブルーチンからの参照がなくなっても別の参照が発生してたらインスタンスは残るでしょ

だから、このサブルーチンが正常終了するかどうかとメモリリークが起きるかどうかは別問題だと思う
サブルーチン外に制御が渡った段階でこの正規表現オブジェクトがどこかのプロセスによって参照されていて、そっちの制御フローの中に猛烈なメモリ負荷が発生する処理が存在すれば、メモリリークの原因になりうる
execループで空文字をマッチさせていてindexが進まずに無限ループしたりとかね

それと、あなたの認識通り、End Subでスタック内のローカル変数のアドレス空間自体が解放されるので、End Subの直前にこの変数SEにNothingを代入する理由はない
モジュールレベルの変数やグローバル変数を使う場合は逆に、制御フロー上の要求としてサブルーチン終了時に参照アドレスをクリアしなければならない場合もある
0796デフォルトの名無しさん (アークセー Sxc5-dWLu)
垢版 |
2019/11/23(土) 19:56:27.67ID:mhmkRKEvx
>>790
仕様ではなくて君のコードの動作の問題
同じ綴りのオブジェクト式の記述をまとめる文法ルールとしてWithを理解するのは大きな間違い

Withで任意のセルを取得して和のセルに貼り付けたらEnd Withまでずっと貼り付けられた先のセルを参照する
その状態で.Valueに値を代入したら、当然貼り付けられたセルの値が変わる

With Cells(i, j)
.Cut .Offset(1,0)
End With
Cells(i, j).Value = k

とすれば何の問題もない
0797デフォルトの名無しさん (ワッチョイ 1301-hZ32)
垢版 |
2019/11/23(土) 20:39:38.41ID:IdTl1qyV0
>>795
わかってて聞いてるんでしょ
わかってなきゃわざわざ「仕様?」なんて聞き方しないだろうし

With で参照してるセルを変更した時の挙動を書いてるドキュメントは見たことないから仕様かどうかはよくわからん
誰か見たことある人いる?
0799デフォルトの名無しさん (ワッチョイ 7b68-QS5Z)
垢版 |
2019/11/23(土) 22:28:15.56ID:K0UQgc8i0
>>790
仕様
cut後もcells()で返ってくるオブジェクトは同じ
そういや上書きされるcells()はどうなるのか、と試してみたらnothingになっていた
この辺はExcelのカットアンドペーストなどでおなじみだけど、いざやってみると不思議な気分だ

Sub foo()
i = 2
j = 3
k = "k-"
Set before = Cells(3, 3)
With Cells(i, j)
.Cut .Offset(1, 0)
.Value = k
End With
Debug.Print before.Value
End Sub
0800デフォルトの名無しさん (アークセー Sxc5-dWLu)
垢版 |
2019/11/23(土) 22:52:50.40ID:mhmkRKEvx
>>799
不思議でも何でもない
変数によるオブジェクト参照の仕組みをもっと正確に理解すべきだろ
カットは貼り付け先のセルの削除と貼り付け元のセルの埋め込みを伴う処理だぞ
貼り付けを行った段階で、変数のスタックに格納されていた貼り付け先のセルのポインタが無効になるので、貼り付け後に変数の中身を評価するとNothingになるだけ
セルの仕様ではなくオブジェクト参照の仕組みからして当然
0803デフォルトの名無しさん (アウアウウー Sa9d-5f43)
垢版 |
2019/11/24(日) 02:19:56.28ID:0nk530rxa
VBAで劇的に工数削減できるような単価の低そうな仕事をしているのなら、
今の仕事の効率化なんかよりプログラミングに習熟してITエンジニアに転職したほうが金を稼げるのではないだろうか
0804デフォルトの名無しさん (ブーイモ MM8d-hgyP)
垢版 |
2019/11/24(日) 02:30:35.85ID:n7Fv0omHM
>>803
そのやりかたは?
フリーランサーになればたくさん稼げる?
在宅ワークも可?
0806デフォルトの名無しさん (ワッチョイ 7b68-QS5Z)
垢版 |
2019/11/24(日) 11:24:51.53ID:h0SmVkt10
>>803>>804
ここで回答するのもアレだが
VBAは基本的に常駐で保守のゴツイ仕事のみ。仕事自体が少なく稼げない。稼ぐなら別のプログラム言語の方が良い。
在宅の案件は更に無い。ゼロと思ったほうが良い(web業者がついでにAccessのVBAをメンテする、といった事例は聞いたことがある)
0811デフォルトの名無しさん (ワッチョイ 9994-1Uwe)
垢版 |
2019/11/24(日) 16:27:31.40ID:IpSlmYmZ0
検索力の問題
0815デフォルトの名無しさん (ワッチョイ c1da-pyDD)
垢版 |
2019/11/24(日) 18:58:17.94ID:C3DnnDsf0
>>809
正常動作しなくなったのは7の時点だけど、その時はAeroを切ってどうにか切り抜けた。
しかし10はどうしたものかなと。
LWA_ALPHAの方は全く問題ないんだけど。
複数のPCで確認したから、おま環ではないと思う。
0824デフォルトの名無しさん (スプッッ Sd73-MY8M)
垢版 |
2019/11/25(月) 11:42:30.29ID:R7yXiHMCd
初歩的な質問ですみません
標準モジュールとユーザーフォームでプログラムを書いています
1つのモジュール内にプロシージャが沢山あり、読みにくくなってしまいました
本を読むとクラスモジュールでプログラムが読みやすくなると書いてありました
どのような時にクラスモジュールを使ったらプログラムは読みやすく出来ますか?
サブルーチンやForNext,if等の繰り返し使うものはクラスモジュールを使った方がいいでしょうか?
0825デフォルトの名無しさん (ワッチョイ 518e-6LQQ)
垢版 |
2019/11/25(月) 11:52:41.48ID:aBzrxBdk0
>>824
そんなことをここで聞くような人には無理
0827デフォルトの名無しさん (スフッ Sd33-mWXg)
垢版 |
2019/11/25(月) 14:41:38.68ID:Md9nMpL2d
ぶしつけで恐縮ですが、シート内の改行を一気に削除する方法を教えていただけないでしょうか。

cellsで指定してreplaceメソッドってやってもできないので、誰かよろしくお願い申し上げます。
0830デフォルトの名無しさん (アウアウカー Sa55-DMja)
垢版 |
2019/11/25(月) 15:30:30.80ID:Q3qCCewla
>>827
VBAスレなんで余談だけど
VBAでやるんなら>>829
手動なら検索窓に「ctrl+J」を入れて全て置換って方法もある
0833デフォルトの名無しさん (アークセー Sxc5-dWLu)
垢版 |
2019/11/25(月) 17:03:29.94ID:Wzgj59oVx
>>824
クラスモジュールというのはユーザーが独自にメソッドやプロパティ、イベントを定義して使えるオブジェクトのことで、本質的にはユーザーフォームと変わらない設計とコーディングに結構手間がかかる
オブジェクト化によるカプセル化がどうしても必要なら試してもいいが、肥大化したモジュールのコードの可読性改善くらいの目的であればやらない方がいいかもしれない
クラス内に定義された関数を呼び出すにも、そのクラスの型をもつ変数を宣言してインスタンスを生成してメソッドを呼び出なければならなくなるのでね

モジュールがごちゃごちゃして嫌なら、モジュールに記載している関数を機能カテゴリに分類して、各機能カテゴリごとモジュールを分ければいいんじゃないのかな
文字列操作系、メール送信機能系、メッセージダイアログ系、みたいな感じの切り分けで
0834デフォルトの名無しさん (ワッチョイ 7145-MY8M)
垢版 |
2019/11/25(月) 18:09:55.21ID:H9kNla+G0
>>833
ありがとうございます
おっしゃる通りで今問題なく動くプログラムをわざわざ変える必要は無いですね
まずはモジュールを分けるところから始めてみます
今後プログラムを作る際の参考にさせていただきます
0842デフォルトの名無しさん (アークセー Sxc5-dWLu)
垢版 |
2019/11/26(火) 20:19:14.53ID:sWZAZ3HSx
>>837
参照追跡方式の本当のガベコレは利用できないけどCOM標準の参照カウンタ方式のリソース管理システムはバックグラウンドで使ってるだろ
循環参照が発生してるとリソース解放できないやつね
0843デフォルトの名無しさん (ワッチョイ 8139-QS5Z)
垢版 |
2019/11/26(火) 20:33:43.32ID:+5U3MHb30
A列の値が「ア行」、B列の値が「あいうえお」のうちどれかであればC列を赤く塗り、
同じく「カ行」で「かきくけこ」のうちどれかであれば青く塗る、というような処理をしたくて
以下のようにしたところ一応うまくいったのですが、
「ア行 and あ」or「ア行 and い」or ……
というような複数条件の書き方はこれであっているのでしょうか?

If InStr(Range("A2").Value, "ア行") > 0 And InStr(Range("B2").Value, "あ") > 0
Or InStr(Range("B2").Value, "い") > 0 Or InStr(Range("B2").Value, "う") > 0
Or InStr(Range("B2").Value, "え") > 0 Or InStr(Range("B2").Value, "お") > 0 Then
Range("C2").Interior.Color = RGB(255, 0, 0)

ElseIf InStr(Range("A2").Value, "カ行") > 0 And InStr(Range("B2").Value, "か") > 0
Or InStr(Range("B2").Value, "き") > 0 Or InStr(Range("B2").Value, "く") > 0
Or InStr(Range("B2").Value, "け") > 0 Or InStr(Range("B2").Value, "こ") > 0 Then
Range("C2").Interior.Color = RGB(0, 0, 255)
0846デフォルトの名無しさん (ドコグロ MM63-hZ32)
垢版 |
2019/11/26(火) 21:29:30.19ID:6EvauiRdM
>>843
> 「ア行 and あ」or「ア行 and い」or ……
> というような複数条件の書き方はこれであっているのでしょうか?
ダメ
AndよりOrの方が優先順位が低いので
InStr(Range("A2").Value, "ア行") > 0
And InStr(Range("B2").Value, "あ") > 0
Or InStr(Range("B2").Value, "い") > 0
Or InStr(Range("B2").Value, "う") > 0
Or InStr(Range("B2").Value, "え") > 0
Or InStr(Range("B2").Value, "お") > 0

(InStr(Range("A2").Value, "ア行") > 0 And InStr(Range("B2").Value, "あ") > 0)
Or InStr(Range("B2").Value, "い") > 0
Or InStr(Range("B2").Value, "う") > 0
Or InStr(Range("B2").Value, "え") > 0
Or InStr(Range("B2").Value, "お") > 0
のように解釈される
なのでA2が "ア行" でなくてもB2が "い" だと成立しちゃう
詳しくは
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/operator-precedence
を見て
0847デフォルトの名無しさん (ドコグロ MM63-hZ32)
垢版 |
2019/11/26(火) 21:38:29.33ID:6EvauiRdM
>>843
そもそも
> A列の値が「ア行」
と言うなら
Range("A2").Value = "ア行"
と書けばいい
InStr(Range("A2").Value, "ア行") > 0
だとA2が "マレーシア行きのバスはここから出ます" でも成立しちゃうけどそれはいいのか?
0848デフォルトの名無しさん (ワッチョイ 8139-QS5Z)
垢版 |
2019/11/26(火) 21:41:08.57ID:+5U3MHb30
あらそうだったんですね。ということは

InStr(Range("A2").Value, "ア行") > 0
And (InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "お") > 0) Then

という感じにすればいいんでしょうか?
0850デフォルトの名無しさん (ワッチョイ 8139-QS5Z)
垢版 |
2019/11/26(火) 21:46:05.70ID:+5U3MHb30
ああなるほど。文言は固定でかぶってる言葉がなかったので大丈夫だったんだと思います
すでにあった文言の組み合わせの違うVBAをいじったもんですからそれを大枠はそれをそのまま
使ったんですけどそう言われればそうですね
0851デフォルトの名無しさん (ワッチョイ 8139-QS5Z)
垢版 |
2019/11/26(火) 21:50:37.69ID:+5U3MHb30
If Range("A2").Value = "ア行"
And (InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "お") > 0) Then
Elseif Range("A2").Value = "カ行"
And (InStr(Range("B2").Value, "か") > 0 Or InStr(Range("B2").Value, "こ") > 0) Then

こうでしょうか?
0870デフォルトの名無しさん (ワッチョイ 69f1-hgyP)
垢版 |
2019/11/27(水) 20:35:10.07ID:fWLksagp0
>>869
ボケがはじまっているのでわ?
アルツハイマーだとやっかいですよ
0872デフォルトの名無しさん (ワッチョイ 1301-7uad)
垢版 |
2019/11/27(水) 20:47:12.82ID:Bgz7f5eR0
>>867
集中してるとそこまで対処してるか!みたいなのが書ける時があって
後から見てなんでこんなのあるんだ?って思うことがある
同じことやろうと思っても出来なかったり
だから自分に対してのコメント必須だわ
0874デフォルトの名無しさん (ワッチョイ c1da-pyDD)
垢版 |
2019/11/27(水) 21:25:04.01ID:Htaq5k6U0
>>819
>>832
もうちょっと調べてみたが、
種類に関係なく、最初に配置したオブジェクトだけが透過することがわかった。
しかも、コマンドボタンは常時透過するが、
テキストボックスとラベルは、アクティブになっている時だけ透過するっていう。
だから、どでかいコマンドボタンに特大フォントで■(四角)を書くとか、
本当に無理矢理やろうと思えば出来るんだろうけど、それはちょっとねぇ・・・。
0875デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/11/28(木) 00:11:11.99ID:SmApZ4N10
VBAでChromeのタブブラウザを思い通りに操作することってできます?
IEのタブブラウザも思い通りに操作する方法も知りたいけど。
0877デフォルトの名無しさん (ワッチョイ 922c-Ql8R)
垢版 |
2019/11/28(木) 01:58:43.77ID:WsOSEkue0
Ruby で、Selenium Webdriver を使っているけど、タブ移動は出来る!

url_0 = "URL 0"
url_1 = "URL 1"

driver.navigate.to url_0 # url_0 を開く

driver.execute_script( "window.open()" ) # 新しいタブを開く
driver.switch_to.window( driver.window_handles.last ) # 新しいタブへ移動する
driver.navigate.to url_1 # url_1 を開く

all_handles = driver.window_handles # すべてのタブ
driver.switch_to.window( all_handles[ 0 ] ) # url_0 へ移動する
0878877 (ワッチョイ 922c-Ql8R)
垢版 |
2019/11/28(木) 02:00:57.37ID:WsOSEkue0
driver.execute_script( "window.open()" ) # 新しいタブを開く

driver.execute_script で、JavaScript のソースコードを書ける
0879デフォルトの名無しさん (スッップ Sdb2-iiDQ)
垢版 |
2019/11/29(金) 13:28:48.35ID:o1brOXQcd
>>874
以前の挙動ってセル罫線は見えるけどセル自体は透過して、下への入力が出来るというものだった記憶があるんだけど、そういう動作を望んでるってことだよね。
単純にセル範囲全体、もしくは部分を完全透過するって意味じゃ無いよね。
セル範囲、もしくは部分を完全透過して下へ入力出来るっていうのなら簡単に実現出来ると思う。
試して無いけど。
0881デフォルトの名無しさん (スッップ Sdb2-iiDQ)
垢版 |
2019/11/29(金) 21:00:27.22ID:o1brOXQcd
>>880
SetLayeredWindowAttributesは多分無理だと思う。
使ったことないけどUpdateLayeredWindowも同じかな?

この種のAPIは諦めて、リージョン使ってウィンドウの形状をくり抜いた形に変形する方法を使って出来たけど、色指定とかも出来ないし、くり抜いた部分は問答無用で透過する。
当然、罫線も透過する。
それからブックのウィンドウを移動すると元に戻る。
こっちはサブクラスでどうにか出来なかったかな。

くり抜く部分は右端列、下端行の見切れる所を正確に取得するのが面倒くさい。
指定セル範囲なら簡単なんだけど。
0882デフォルトの名無しさん (スッップ Sdb2-iiDQ)
垢版 |
2019/11/29(金) 21:05:43.61ID:o1brOXQcd
元々、無理矢理やろうとしてたのは半透明にしてその描画をメモリに取得してから完全透明にして、デスクトップに取得した描画を書き込むことを考えたけど、再描画で無茶苦茶チラつきそうで断念した。
0884デフォルトの名無しさん (スッップ Sdb2-iiDQ)
垢版 |
2019/11/29(金) 23:10:37.96ID:o1brOXQcd
ググレばサンプルや答えが見つかるとか言ってた奴がいたけど、ググってどうにかなるようなレベルの低いものは、問題にすらならないわけでね。
わざわざ覚えるようなことをしてないだけでググレば答えが見つかるのが分かってるんだよ。

一方、問題になるようなレベルの高いものはググっても答えが見つかることは殆ど無いわけだ。
0885デフォルトの名無しさん (ワッチョイ 655f-abYQ)
垢版 |
2019/11/30(土) 16:10:24.85ID:gvdsBQuZ0
最近独学ではじめたんだがググっても出ないから質問させてくれ
if の条件式をセルから読み取ることできない?
例えば
セルA1に1+1=2って入力してあって
VBAで
if cells(1,1).value then
end if
的なことを実行したいんだが・・・
0887デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/11/30(土) 16:26:59.80ID:PE5ncLuo0
セルA2には1+1=3って入力してあるんです
0889デフォルトの名無しさん (ワッチョイ 655f-abYQ)
垢版 |
2019/11/30(土) 17:14:03.21ID:gvdsBQuZ0
>>886
すまん例がわるかった
セルになんでもいいから条件式が入力されてて
それをVBAのif文で読み取りたい

>>888
ありがとうございます。やってみます。
0893デフォルトの名無しさん (ワッチョイ 655f-abYQ)
垢版 |
2019/11/30(土) 18:58:56.97ID:gvdsBQuZ0
>>892
そういうこと
条件の例が悪すぎだった
0894デフォルトの名無しさん (スプッッ Sd12-abYQ)
垢版 |
2019/11/30(土) 19:00:48.42ID:vHVqnqrEd
文字列(1+2)*3を計算して数値にしてくれる方法ないかね
0901デフォルトの名無しさん (ワッチョイ 0920-tQqL)
垢版 |
2019/12/01(日) 01:14:32.95ID:hVa/XxLC0
転記マクロを作っていて、AのブックからBのブックに転記をしようと考えているのですが
Aの転記する部分を一旦構造体に全部取り込んでしまってからBブックを開いて転記する方法と
AとBのブックをその都度比較して転記するかで悩んでいます
どっちの方がいいんでしょうか?
0903デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 01:32:52.78ID:Mv7XM2680
オブジェ.pastespecial(xlpaste〇〇)
オブジェ.pastespecial paste := xlpaste〇〇

これ何が違うの?
前者は戻り値はカッコをつけるっていうルールに従ってなくね?
0904デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 06:15:52.01ID:qadFHjVDx
>>903
前者はメソッドが返す戻り値を取得するために関数としてメソッドを使用している
文法上、引数指定の箇所で括弧が必要

後者はメソッドをコールしてそのまま次の処理に制御を渡している
引数指定の箇所には文法上括弧が不要
0905デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 06:39:57.40ID:Mv7XM2680
>>904
関数とメゾットの違いって何?
pastespecialってメゾットじゃないの?
0906デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 06:49:15.69ID:Mv7XM2680
pastespecial xlpaste〇〇

これでも行けた…
pastespecialメゾットの戻り値ってなんだ?
x = オブジェ.pastespecial(xlpaste〇〇)

こんなの使うときあるの?
pastespecialの戻り値を使う意味が全くわからない


If MsgBox("実行しますか?", vbYesNo) = vbNo Then
これは戻り値がTRUEかfalseだから意味がわかるけど
0907デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 07:55:36.72ID:lg6qJlYj0
>>903
オブジェ→オブジェクト

Selection.PasteSpecial Paste:=xlPasteValues
Selection.PasteSpecial(xlPasteValues)
そういう文法。
前者のメリットは指定できる引数が大量にある時、一つだけ記述することができる上に見やすい
ただ、「:=」のコロンを見落としやすいのがネック
引数が一つだけの時は前者で書く理由はないと思う

>>905
メゾット→メソッド
メソッド=クラス内関数
ただ、vbaなんて全部applicationクラス(と思う)から、関数は全てメソッドに当たりそう
pastespecialはメソッドで間違いない

>>906
>こんなの使うときあるの?
>pastespecialの戻り値を使う意味が全くわからない
そもそも使わないから返り値なんてなんでも良い
俺も使った事無いけど、あえて返すとすればペーストの失敗か成功なのは間違いないだろう
0908デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 08:06:02.34ID:qadFHjVDx
>>905
メゾットではなくメソッド(Method)ね
PasteSpecialはメソッドだよ

関数の定義は曖昧だが、ここでは制御と戻り値を返す命令文の意味で使っている
一方メソッドはオブジェクト外からアクセス可能になるようメンバとして実装された機能プログラムのことを指す
戻り値を返すものと返さないものの両方がある
0909デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 08:12:27.61ID:Mv7XM2680
>>907
あんまわからないけど
endプロパティは
end(xlup)これ以外に書く方法ってある?
end shift :=xlupとかそんなのでもいけそうな感じするけど
0910デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 08:14:33.55ID:qadFHjVDx
>>907
細かい話だが、VB6共通の標準関数やステートメント類、列挙定数はApplicationクラス配下のメンバではないはず
あと調べていけばApplicationクラスから独立しているクラスもあるかもしれない
プログラム本体をコードする言語ではなくマクロ言語なのでApplicationというカレントなインスタンスに依存しないクラスがあってもおかしくない
0911デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 08:17:59.92ID:Mv7XM2680
初心者にメンバとかクラス外とか言われてもわからん
0912デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 08:25:10.96ID:BdsW8ng60
>>903,906
引数の指定方法が、位置指定か名前付き引数指定かの違い
戻り値使わないときでも引数の指定に括弧を付けても問題ない

>>905
関数とメソッドの違いはあいまい
ヘルプ類見る限り、VBA組み込みのメソッドを関数と呼んでるっぽい
一般的にはそれ以外のオブジェクトのメソッドも関数と呼ばれたりする


PasteSpecialの戻り値は俺も使ったことないからよくわからんな
まあ戻り値があるからといって、必ず使わなければいけないというもんでもない
0915デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 08:37:40.53ID:Mv7XM2680
>>913
メンバとオブジェクトの違いって何?
0917デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 08:39:31.79ID:Mv7XM2680
>>916
なんでカッコがいるんだ…
end direction :=xlupじゃダメなのか…
こういうのって気にする人いる?
エラー出たらかっこつけるとかメソット、プロパティの引数指定にはとりあえずかっこつけるとかしてる?
0918デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 08:48:55.22ID:lg6qJlYj0
>>909>>917
今回はプロパティ。さっきのはメソッド
vbaは見た目が一緒だから死ぬほどややこしいけど、まぁいつも通りに書いてればいいよ
俺もendはメソッドと思ってたけど問題なかったし

>>910
そうそう、その辺り考え出すとまぁ例外もあるよな〜って思ってたけどアホらしくなって考えるのを止めた

>>911
このレベルの事を聞きたいなら最低限クラスは覚えないとついていけないぞ
ただそれを理解すれば一気にレベルアップする
0924デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:04:29.40ID:Mv7XM2680
なんかイマイチな答えしかこないな

俺は、プロパティ、メソッドで()がつく場合とつかない場合の違いは何?
全部()つけるでいいの?どう意識してるの?ってきいてる

これに対してクラスガーとか言われてもわからん
0925デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 09:04:33.88ID:BdsW8ng60
>>917
プロパティの引数の括弧は省略できなかったと思う
メソッド(関数)呼び出しで、戻り値を使わない場合は括弧がなくてもいい

この辺は、大昔の文法との見た目を合わせるための仕様
慣れれば自然と使い分けれるようになるから頑張れ
0926デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:05:35.25ID:Mv7XM2680
>>923
RANGEもコレクションだろ
RANGE(a1)でメンバーだろ
0929デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:09:06.82ID:Mv7XM2680
>>928
君はどうしてるの?
0930デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 09:20:24.90ID:BdsW8ng60
>>929
俺は
名前付き引数は使わない
括弧を省略できるときは省略する

基本はこんな感じ
でもそう書かないときもある
あと複数人でソース見るときは事前にルール決めることもある
0931デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:27:30.25ID:Mv7XM2680
>>930
なるほど!
名前付き引数を使わないときや戻り値を使うときには()がいる
名前付き引数を使うときは:=で()不要
この認識でいい?
0932デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 09:30:09.60ID:qadFHjVDx
>>926
全然違う
RangeクラスとRangeプロパティを混同してはいけない

Range("A1")の式はWorksheetクラスのメンバのRangeプロパティを引数つきで呼び出している
このプロパティ式で参照を取得しているのが、Excelのオブジェクトモデルで定義されたRangeクラスの実体(インスタンス)、つまりA1セルになる
要するに、Range("A1").Valueと書いた場合、.Value以下がRangeオブジェクトのメンバになる

Rangeクラスがセル範囲のコレクションとして自己再帰的に実装されているのは確かだけどね
0935デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:47:10.20ID:Mv7XM2680
>>932
中級者ならわかるけど
初心者にはまったくわからんな
そこらへんの文法を初心者向けに解説してるサイトある?
0939デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 10:05:48.08ID:qadFHjVDx
>>935
緑川吉行っていうOffice/VBA界の有名人が初心者向けに書いた記事
https://allabout.co.jp/gm/gc/297719/

これはコンパクトで分かりやすい。ただし初心者向けにわざとSheetsをオブジェクト名とかコレクション名とか言っているのは問題がある

正確な知識を得るならこっち

インストラクターのネタ帳 -
「オブジェクト名.プロパティ」という解説はウソですよ
https://www.relief.jp/docs/excel-vba-that-is-not-object-name.html
0940デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 10:12:50.14ID:qadFHjVDx
>>938
Callの引数として引数付き関数を呼び出す場合、呼び出される側の引数を特定して先に評価してCallに渡さなきゃいけないから括弧必須なんだよな
しかも戻り値が取れないという
0942デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/12/01(日) 10:21:01.02ID:19U1wNi50
>>939
どう間違ってるのですか?
0944デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 10:25:54.76ID:qadFHjVDx
>>941
組み込みオブジェクトはそもそも仕様としてNewできなさそうだけどな
要は As ActiveCell とか As Cells とかいう型指定が出来ないってことだわ、そういうクラスが存在しないわけだから
0947デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 11:27:41.76ID:lg6qJlYj0
インスタンスという概念が無いとそれが新規のオブジェクトなのか既存のオブジェクトかの見分けが付かないよ
他の言語だとstaticとかインスタンス化せずに使えるクラスもあるけどね
0948デフォルトの名無しさん (スップ Sd12-a1aH)
垢版 |
2019/12/01(日) 11:52:45.15ID:tARyXBCrd
インスタンス化は実体化するため=メモリ領域確保するためって解釈だけど
integerだろうがstringだろうがメモリ確保してるわけだし

>>947
dim x as classtest
dim y as classtest
みたいなので見分けってつかないの?
0949デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 12:08:59.14ID:qadFHjVDx
正確に言うと値の代入もLetステートメントで行うのがBasic系言語の本来の姿
それを規約上で略記できるようにしているにすぎない
逆にSetステートメントは言語設計上、変数用に確保されたスタックメモリに格納される値がヒープへの参照ポインタであることを示す役割を持っているものと思われる
Variant型変数にオブジェクトを代入するときもこのSetがあるおかげで、スタックの値を参照アドレスとして解釈できるようになっているはず
0952デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 14:45:17.26ID:qadFHjVDx
>>951
Letとのバッティングだろう
推測だが、VB6/VBAのコンパイラは、代入演算子と等価演算子がともに'='であることを前提とした仕様になっているんだと思う
プリミティブ型の値の代入はスタックの値のコピーに他ならないので、代入演算子を等価演算子と混同しても論理矛盾が起きない

オブジェクトの場合はそうはいかないので、オブジェクト変数として型宣言した変数へのインスタンス代入の際にはSetの識別子付与を強制するようにしてるんじゃなかろうか

VB.NETではSetが要らなくなってるからコンパイラの仕様だよなこれは
0953デフォルトの名無しさん (ワッチョイ 9279-luhV)
垢版 |
2019/12/01(日) 15:01:32.65ID:pJZuHPp00
参照カウント型GCの都合だよ
Setで左辺のオブジェクトの参照カウントが+1されて変数に束縛される
左辺がNothingだったら束縛していたオブジェクト参照カウントを-1する
変数がemptyやNothingだったら何もしない
見た目以上に重い代入処理
関数や手続きの戻りまで行ったら全てのローカル変数に対してSet 変数 = Nothing相当の処理をする
だから関数の最後でNothingの代入は不要
ただし
0955デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 15:43:44.55ID:BdsW8ng60
>>951
Setが省略できないのはデフォルトプロパティとの絡み
SetもLetもないと、デフォルトプロパティへの代入なのかインスタンスそのものの代入なのか区別がつかないから
文法解釈の問題で、GCや参照カウンタの問題ではないよ

>>952
VB.Netではデフォルトプロパティという概念を変えて
一部条件以外でのデフォルトプロパティの省略を禁止した
コンパイラは文法を解釈してるわけで、言語仕様の問題

ちなみに=が等価演算子か比較演算子かの解釈に、値型か参照型の区別は関係ない
VB.Netがそうだろ
0958デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 16:05:54.42ID:BdsW8ng60
>>942
ちょっとリンク先見てみたけど、微妙な説明してるなぁ
混乱する一番の原因は、
オブジェクトを返すプロパティには、そのオブジェクトの型と同じ名前を使う
っていう指針があるから

Dim r As Range
のRangeは型名(=オブジェクト名)

Set r = ActiveSheet.Range("A1")
のRangeは文法的にはWorksheetオブジェクトのRangeプロパティ
RangeプロパティはRange型のインスタンスを返す

ActiveSheetなんてオブジェクトはないが、これは
Set r = Application.ActiveSheet.Range("A1")
の省略形とみなされるので、ApplicationオブジェクトのActiveSheetプロパティだと解釈される
ActiveSheetプロパティが返しているものがWorksheetオブジェクト(のインスタンス)

Worksheet型じゃなくてSheet型だろとかいう突っ込みとか
Rangeのデフォルトプロパティだろとかいう突っ込みは勘弁な
0959デフォルトの名無しさん (ワッチョイ 9201-MhVQ)
垢版 |
2019/12/01(日) 18:07:13.10ID:Enyr5Fgf0
>>958
> 混乱する一番の原因は、
> オブジェクトを返すプロパティには、そのオブジェクトの型と同じ名前を使う
> っていう指針があるから
違うよ
オブジェクトなんて曖昧な用語を使うから混乱するの
型(クラス)と実体(インスタンス)をきちんと区別すればいいだけ
0962デフォルトの名無しさん (ワッチョイ 69f0-a1aH)
垢版 |
2019/12/01(日) 19:43:10.04ID:oxdJbHeB0
値型はNewしないで参照型はNewするというルールに従うと
別言語でStringは参照型なのに何でNewしなくていいのかと悩んだな
結局参照型でもNewしなくていい場合があるってスルーするのが一番だけど
0964デフォルトの名無しさん (ワッチョイ a9b3-nvwQ)
垢版 |
2019/12/01(日) 20:17:07.69ID:Ta8YhOMq0
え、プロパティの引数って絶対に()つけないといけないの?
そこら辺の文法が謎だわ
本でも説明されてないし
ネットで検索しまくってもプロパティの引数には()をつけろなんて書いてないし
どこでそんな知識仕入れてきたの?
0966デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 20:35:21.31ID:Mv7XM2680
>>965
endとかだよ
0969デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 21:14:55.98ID:Mv7XM2680
>>968
プロパティの引数に()いるの?に対してその答えはおかしい
0970デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 21:23:50.92ID:qadFHjVDx
>>969
ひょっとしてまだメソッド/プロパティの引数指定の丸括弧記法の話をしていたのか?メゾット君
プロパティのアクセサの引数指定は丸括弧必須
戻り値を取得するための命令だから当たり前
0971デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 21:51:43.86ID:lg6qJlYj0
>>966
いや、うん。そこじゃないんだ
普通に考えると「プロパティに引数がいるの?」なんだ
プロパティに引数は普通は不要。プロパティは「セルの内容」「列幅」など、取り出すだけのもの
プロパティてのは大体「設定]的な意味

vbaはかなり古く誕生した言語な割に大変長寿で、かなりおかしなことになっているってのはあるけども

>>958に集約されている
0972デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 22:00:59.47ID:qadFHjVDx
>>971
クラス側で保持するプロパティという概念自体には引数という観念が成立しないのはその通り
でもこの人が言ってるのは多分プロパティの受け渡しに使うアクセサの引数のことだと思う
0973デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 22:13:02.79ID:Mv7XM2680
>>971
設定に引数がなんで必要ないの??
0974デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 22:16:58.66ID:Mv7XM2680
アクセサ VBA

はい、なんもヒットしません
初心者に解説する場合、専門用語を使うってどうなの?
0976デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 22:28:21.62ID:Mv7XM2680
プロパティに引数もてるとか持てないとかはっきりしろよ…
0977デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 22:29:04.82ID:lg6qJlYj0
>>972
おう、これは本気で行くしか無いぞ
>>973
そうじゃなくて、逆なんだ。vbaにはわざわざ引数が用意されている

プロパティの場合、引数じゃなく代入で済ませる方が自然なんだ

cells(1,1),value = "これを設定する"
A1に"これを設定する"という文字列が入る
この場合、プロパティに引数は使われていない。プロパティに直接代入している

本来ならこう書くべきだ
cells(1,1),value.setter("これを設定する")

この辺りはずっとsetter/getterを用意しようぜって流れが主流になった
0980デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/12/01(日) 23:25:29.33ID:19U1wNi50
>>979
「汗臭」で検索してないか?
0982デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/12/01(日) 23:46:59.48ID:19U1wNi50
>>981
なんだとこのツルッパゲ!
0984デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/02(月) 06:20:27.87ID:jajTU6Llx
このあたりの話は自分でクラスを作ったことがなければ分からないと思う
ともあれ、質問者の意図は引数付きのプロパティ式で丸括弧を省略できるかどうかという話なんだろうから、出来ないという結論で締めて終わり
要するにRange("A1")をRange "A1" とは書けない
これだとRangeという名前のSubプロジージャに引数"A1"を与えるという全くデタラメな構文になる
0986デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/12/02(月) 12:07:45.41ID:b+6W/5Or0
Tsuruppage("A1")
0987デフォルトの名無しさん (スッップ Sdb2-iiDQ)
垢版 |
2019/12/02(月) 12:58:25.24ID:bEJSdplkd
初心者にとって感覚的に分かりやすいのは戻りを使う場合はカッコを使う。
戻りを使わない場合はカッコを使わない。
Call文だけ例外でカッコを使う。

で良いんじゃね?
0988デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/02(月) 20:27:37.88ID:HFZWrDUD0
>>987
end(xlup)
戻り値ってなんだ?
0991デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/02(月) 21:03:22.49ID:HFZWrDUD0
>>990
ENDの()のどこが戻り値なのかきいてんだよ…
ガイジかよ
0993デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/02(月) 21:52:36.19ID:HFZWrDUD0
Cells(i, j).Borders(xlDiagonalDown).LineStyle = xlInsideHorizontal

わかりやすくな
プログラム初心者でもわかるように解説しろ
ボーダーには()でラインスタイルには=
どちらもプロパティなはず
なんで?
どれがなにの戻り値なの?ってのを
主語がなかったりテキトーなカタカナでごまかしてるのおおすぎ
0996デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/02(月) 22:13:40.36ID:4BXx3P/Mx
LineStyleプロパティは引数の指定を要求されないプロパティだから()による引数指定は要らない

かつ、Linestyleプロパティは値の読み取りの他に値の設定も可能なプロパティなので、代入演算子の = でxlLineStyle列挙体の定数を設定することにより、罫線の書式を設定できる

プロパティだから()が必要なんだとか=が必要なんだとかっていう単純な捉え方は理解の妨げになるからやめた方がよい

引数による要素の指定を要求/許容しているのか、値の読み取りだけでなく値の設定も出来るのかといった個々のプロパティの仕様の違いにより、式の書き方が変わるだけ
0997デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/02(月) 22:16:41.89ID:gEmwbuWH0
ってかこの一連の問題、すげー難しいよ
初心者を自覚してるならあまり深く考えないほうが良いと思う
得るものは少ない、ぱっと書き方だけ覚えてどんどん次へ進んだほうがいいような
0998デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/02(月) 22:17:27.68ID:4BXx3P/Mx
WorksheetオブジェクトのCellsプロパティなどは引数なしでも引数ありでも使用できるし、=で値も設定できる
()の要不要とか=を用いた代入の可否なんてプロパティの仕様によるとしか
1000デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/02(月) 22:20:29.46ID:HFZWrDUD0
>>996
引数の要求をされないプロパティ??
linestyleだけではエラーになるのでは?
レンジのラインスタイルです!だけは意味不明でしょ

値の設定?読み取り?
設定 罫線を引く?
読み取り ???
つまりどういうこと?

定数を設定??
bordersの引数も定数では?
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 77日 2時間 45分 30秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況