Excel VBA 質問スレ Part79(ワッチョイあり)

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ aaa4-I2zm)
垢版 |
2023/01/28(土) 12:12:12.41ID:UjlIZ1Ov0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

ExcelのVBAに関する質問スレ
コード書き込みや作成依頼もOK

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
Excel VBA 質問スレ Part77
https://mevius.2ch.net/test/read.cgi/tech/1658009255/
Excel VBA 質問スレ Part78
https://mevius.2ch.net/test/read.cgi/tech/1667104996/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
27デフォルトの名無しさん (スププ Sdba-5IHC)
垢版 |
2023/01/30(月) 09:40:56.25ID:e2a+Lyz1d
元々半角スペース入ってなかったのにデータをかきかえたりすると文字コードがShiftJISではない場合、文字化けして半角スペースが入るのでしょうか?
2023/01/30(月) 10:51:56.77ID:Vha856Nid
ここはVBAスレなのでスレチでは?

Excel総合相談所 144
https://egg.5ch.net/test/read.cgi/software/1619665985/
2023/01/30(月) 11:54:01.10ID:beImLHJmr
>>26
https://www.officepro.jp/exceltips/tips_format/index19.html
これとか?
セルの表示形式の問題?
30デフォルトの名無しさん (スププ Sdba-5IHC)
垢版 |
2023/01/30(月) 15:20:40.00ID:e2a+Lyz1d
>>29
たぶん、それだわ
ありがとう
2023/01/30(月) 15:57:22.13ID:dCL8a0ux0
>>29
その記事、余白と空白文字(半角スペース)を同一視してるのが気持ち悪いな
2023/01/30(月) 19:11:31.03ID:uxYUj7Ria
>>31
そうは言ってもExcelだと余白を空けるのに空白しか使えないから仕方なくね?
2023/01/30(月) 21:40:04.89ID:dCL8a0ux0
>>32
正しい余白ならインデントってのがあるが

CSVにしたらどうせ書式はなくなるのに、書式を空白で表そうとするEXCELが気持ち悪いのか
そのくせインデントは無視するという
2023/01/30(月) 22:17:38.88ID:uC26F0Aa0
>>33
なるほどインデントは忘れてたわw
2023/01/31(火) 05:21:30.98ID:JnYo5yDia
余白はデータじゃなくて、見た目。
見た目のために、データを変更するのか?

それなら、trim などで、データの先頭末尾の空白類を除去する必要がある
36デフォルトの名無しさん (アウアウウー Sa47-B/zI)
垢版 |
2023/01/31(火) 12:24:23.88ID:XEbPQm8Ra
余白は木を切る~
2023/01/31(火) 15:00:10.31ID:bFYKhQ9l0
うまい!座布団何枚?
2023/02/01(水) 15:16:25.31ID:J3cdB8RP0
>>25
レス感謝です。
呼び出しだけなので「お父さんやって」的なイメージでした。

>もし同じような親クラスDを作成して同じ子クラスを
>使おうとするとその中で親クラスAを作成することが
>前提となってしまい、親クラスDでは使えない場合が出てくる。

ここがわかりませんでした。

ClsFatherとClsSonの二つがあるとします。
メインでClsFatherから父親シルバを作成、
自動的にClsFatherの中で息子キルアが作成されて父親のプロパティにセットされる
親クラスDにあたる父親ジンをClsFatherから作成して、息子ゴンがを作成される
息子ジンが継承もどきで使う機能は父親ドンのだけのつもりでしたが、
継承って本来は父親シルバ、息子ゴンみたいな組合せも自由に出来るものって意味だから
それじゃ違うよってことですか?

息子ゴンのメソッドでどの親メソッドを継承するかをImprementsとかで動的にしなさいということですか?
2023/02/01(水) 18:01:33.64ID:lcTv0p8q0
>>38
親が子を生成するのはいいけど、お前の設計では子が親インスタンスを生成するんじゃないのか?
ジンがゴンを生成しても、ゴンの親はゴンがきめるんだぞ
2023/02/01(水) 19:12:55.35ID:J3cdB8RP0
>>39
そうです。子も親のインスタンスを生成します。
当然オブジェクトとしては別物ですが、同じクラスからの生成ですので、
同じ親の機能を使えるという意味です。

実際にゴンはジンを作れず、ジンとほぼ同じ能力を持つ別の何かの力を使って
継承に見せかけるという事です。

この見せかけ行為が本当の意味での親オブジェクトの機能継承にあたらず危ないよって意味でしょうか?
で、本当の意味での親オブジェクトの機能を使うならCallByNameやImprementsを使いなよって意味でしょうか?
2023/02/01(水) 22:04:53.94ID:J3cdB8RP0
すみません。質問途中に別の質問をする事になってしまいます。
自力で解決出来ませんでした。

VBEのCtrl+hボタンで出てくる置換機能で、パターンマッチングを使用するにチェックを入れました。
Ai.Erase
Ai.Create
AiErase
AiCreate

この4つのワードにおいて、パターンマッチングとして
Ai[AE]としたら下の二つにだけマッチングしました。
そしたら一致したAとEは温存しつつAiとA or Eの間にどっとを入れたいのです。

実際はもう少し複雑なパターンなのですが。簡略化するとこんな感じです。
一致したAとEが消えてしまうので困っているのです。
一致した[AE]のどちらかをそのまま残したいと
Ai.[AE]みたいにしても置換後文字列はAi.[AE]がそのまま出てきてしまいます。

思ってるような使い方は出来ないという事でよろしいでしょうか?
2023/02/03(金) 01:33:26.18ID:0K9bvbAh0
Sub test_if()
a = -1
If a >= 2 Then
Debug.Print "aは2以上"
Else
Debug.Print "aは2未満"
End If
End Sub

というマクロなんだけど<>を使わずに同じことが可能?
<>はネット上では禁止されてる場合があるので。
2023/02/03(金) 06:07:59.84ID:VZIBsXzk0
範囲を指定できるのであればCase文でtoを使うとかかな
2023/02/03(金) 07:22:57.06ID:3sKN4Loqa
>>42
完全に同じかどうかは知らんが
If Application.WorksheetFunction.Min(a, 2) = 2 Then
2023/02/03(金) 11:32:43.16ID:bf4OLvi00
オートフィルタの或る列が昇順でソートされているかどうか
を判定する方法を教えて下さい。
2023/02/03(金) 11:36:12.10ID:bf4OLvi00
>>45
昇順か降順かは問わず、ソートされているかどうかでした。
2023/02/03(金) 19:20:46.12ID:UC5jDXxN0
>>45
自分でソートしたものと比較して同じ順番だったらソートされているといえる
2023/02/03(金) 19:24:07.79ID:fZLyE03H0
いや待て、どっかのプロパティにフラグがないかを尋ねてるんだと思うぞ
俺は知らないがな
2023/02/03(金) 20:25:48.41ID:6Slrjruv0
フィルターのボタンに↑↓とか表示されない?抽出とかだとロートの図が出てたり?
50デフォルトの名無しさん (ワッチョイ ff19-gKyW)
垢版 |
2023/02/04(土) 01:29:18.62ID:Wbq5qWPo0
>>38
そそ、
そういう「どっちの親でも使える」ようにするために
そういう場合は継承は使わずに、移譲でやるのがいいんじゃないかと。
そもそもVBAじゃ厳密な意味の継承は使えないけどね。
2023/02/04(土) 03:13:48.63ID:5cp+GCIG0
一次元配列の中に二次元配列を入れるのってシートから二次元配列として取り込まない限り無理ですか?
例えばa(2)って一次元配列を作って
a(0)=cells(1,1).currentregion
とした場合、a(0)(1,1)と格納されるよね。
一方、b(2)って一次元配列をつくってそこに2次元配列を格納しようとしてredim b(0)(100,100)って宣言してもエラーになるよね?
2023/02/04(土) 03:22:13.04ID:5cp+GCIG0
特に複数のcsvを一次元配列ごとに二次元配列として取り込みたかったんたけど、それができなくて困ってます
0.csv→a(0)に二次元配列として格納
1.csv→a(1)に二次元配列として格納
2.csv→a(2)に二次元配列として格納
よくありそうなパターンですけどネットで調べても出てこなくて…
何かいいアイディアはあるでしょうか?
2023/02/04(土) 06:12:27.84ID:JIMr/Iwq0
>>52
csvを格納するならそのまま格納して取り出すときにsplitで配列化したらどうか。
デリミタ変えてcsvを繋げてあげれば擬似的に2次元配列に出来んじゃね?
2023/02/04(土) 06:14:50.01ID:JIMr/Iwq0
>>53
あるいはdirectoryのitemに2次元配列としてaddするか
2023/02/04(土) 06:19:01.21ID:JIMr/Iwq0
>>54

> >>53
>スマン。directoryじゃなくてdictionaryだw
2023/02/04(土) 08:21:23.33ID:XHbOUS2x0
>>48
その通りです。ネット検索しても出て来ないため、ここで聞いてみてどうかなと思いました。
>>49さん仰るように矢印がボタンに表示されるので、何かあるはずと思ったのです。
2023/02/04(土) 09:06:33.92ID:YYLIzwcR0
>>45
ググっただけだけど
Worksheet.AutoFilter.Sort.SortFields
あたりを見ればわかるんじゃね?
てかMSのDocsもこの辺りのドキュメントが貧相で困るわ
2023/02/04(土) 09:14:10.73ID:xQtdr6Ugd
>>45
AIさんからの天の声です

Sub CheckSortOrder()
Dim sortOrder As Boolean
sortOrder = ActiveSheet.AutoFilter.Sort.SortOn
If sortOrder = True Then
MsgBox "The column is sorted in ascending order."
Else
MsgBox "The column is not sorted in ascending order."
End If
End Sub
2023/02/04(土) 10:59:33.56ID:mzRI23fF0
>>58
だからさ、そのコードが有効かどうかを、先ずはじぶんで検証しろよ ゴミコードだろうと何でも貼りゃあいいってもんじゃねーぞ
△! オブジェクトは、このプロパティまたはメソッドをサポートしていません。だぞ おま環のせいで動作しないだけってか?
検証もしてない野良コードは世間の大迷惑 AIなら間違わないってか? 訊ねる人間側に問題あるからゴミコード吐くのに気付け
2023/02/04(土) 11:20:43.51ID:EUGDlgP1d
>>59
そのコードを検証することは重要です。そのコードが有効かどうかは、まず自分で確認する必要があります。「AIなら間違わない」という考え方は誤りです。AIモデルはトレーニングデータから学習するだけであり、常に正確ではありません。野良コードを使用しても問題が起こる可能性があり、それが世間を混乱させることがあります。
2023/02/04(土) 13:12:21.87ID:sIc7L3oe0
>>53
「csvを格納するならそのまま格納して」って言うのが、まさにその方法を知りたいっていう質問でした
Line Inputをつかって一行ずつ一次元配列に分割して、それを二次元配列に格納して、二次元配列の一次元目を増やして…ってのを繰り返すってのを考えました
(二次元配列の一次元目を増やすプロシージャを作成する前提)
ところがredim b(0)(100,100)という宣言自体がエラーになるのでどうしたものかと
2023/02/04(土) 14:48:40.79ID:JIMr/Iwq0
>>61
お役に立てたのならなによりっす。

でもその内容を聞いた感じだとcollectionかdictionaryを使ったほうがいい気もする。csvがどのくらいの文字数かわからんけど下手するとオーバーフローしそうな気が、、、

あとそもそもファイル操作で読み込むんじゃなくてPowerqueryとかでデータテーブル化してしまえば扱いやすい気も、、、あ、スマンね。いらぬお節介やった。
2023/02/04(土) 18:22:34.02ID:Av2vQos/0
>>61
そういうのって1次元の配列にCSVから作った2次元配列を足していくジャグ配列だよね
a(b)(c,d)として使いたいってそういう事だよね
CSVから2次元配列に落とす部分は自力で適当に作るしかないと思うよ
2023/02/04(土) 19:42:17.96ID:3xAEA7yN0
>>52
2次元配列を格納したバリアント型の1次元配列を使えばまあできるんじゃね
2023/02/04(土) 22:05:52.42ID:sIc7L3oe0
>>62
ジャグ配列はまさにその通りです!
色々調べてみたところ、Workbooks.OpenTextで一度新しいブックを開いて、そこをcurrentregionで二次元配列として取得するのが一番早そうでした
シート一度貼り付けて、そこから取得するのがちょっとかっこ悪い気もしますが、コード的には一番楽のだと思うのでそれでいきたいと思います
ありがとうごさいました!
2023/02/04(土) 22:07:02.46ID:sIc7L3oe0
>>63
すみません、安価こっちでした
>>62さんも>>64さんもありがとうございました!
2023/02/05(日) 06:12:14.98ID:zxOMW0wY0
>>65

解決の糸口が見つかってよかったです。
シートに貼り付けるのは一見かっこ悪く見えるかもしれませんが、エクセルの場合シート自体が目視できる2次元配列みたいなものなのでデータ用のシートを用意しておくのはデバッグの意味でも有効と思います。
最終的に非表示にしておけばデータを変えて不具合が出たときに参照できますしね。
2023/02/05(日) 17:55:21.75ID:IrR7f/G90
シートに読み込ませてUsedRange.Valueで二次元配列を取得する場合はインデックスが1オリジンになるとこだけ注意
2023/02/08(水) 13:33:38.06ID:yPPt1d0+d
名前の定義で範囲に名前をつけると数式で使用できますが、
VBAで自作関数を作り、その引数として定義した名前を使用するとエラーとなってしまいます。
一応定義した名前の後に&“”を付けて文字列化すればエラーを回避できるのですが、毎回これを入力するのは煩わしく見栄えも悪いのでできることならなんとかしたいのですが
解決策ありましたらご教示の程お願いいたします。
2023/02/08(水) 14:59:06.65ID:oAUh4t2x0
その関数のシグネチャとエラーメッセージぐらいかけよ
71デフォルトの名無しさん (アウアウウー Sa93-4QSx)
垢版 |
2023/02/08(水) 15:37:35.62ID:FTgAG7p2a
毎回やるならインターフェース関数作ればいいだけ
2023/02/08(水) 20:18:25.84ID:GAx9K2n2d
>>69
実現したいことがどんなことなのかわからないけど名前定義した範囲をRange型の変数にsetしてRange型のまま引数として渡しちゃいかんの?
2023/02/08(水) 23:15:53.95ID:Gaz3gRVpd
言葉でうまく説明できないので画像で説明させていただきます。
例えば引数の文字列に別の文字列をくっつけて返すだけのシンプルな関数を作ります。
当然引数にセルを指定すれば問題なく使用できます。
https://i.imgur.com/SnSyEby.png

次に、範囲に名前をつけてそれを引数として使用します。
https://i.imgur.com/6mcu5nn.png

するとこのように「#VALUE!」エラーが出ます。
https://i.imgur.com/9NNr0sB.png

ちなみに範囲の名前に&“”をつければ期待通りの結果になります。
https://i.imgur.com/haXX7gC.png

と、SS撮ってて気づきましたが範囲の中から同じ行のセルを選んで渡す必要があるのですね。
VLOOKUPの第一引数なんかで同じことをすると自動的に同じ行だけを渡せるので勘違いしていました。
74デフォルトの名無しさん (ワッチョイ 0fda-zLlH)
垢版 |
2023/02/09(木) 07:05:59.22ID:bJr31kU+0
>>73
検証してないので的外れかもしれないけどたぶんRangeのデフォルト値の問題かと。
うろ覚えだけどvariant型で渡されているからセル単体を引数で渡すとセル内容の値の型(今回はstring型)を渡すけど
複数セルを渡すとrange型のオブジェクトとして渡されてるんじゃないかな。
なので自身で書かれているようにセルを特定してあげないといけないのだと思う。
2023/02/09(木) 23:30:18.42ID:TUokDGw70
>>73
>範囲の名前に&“”をつければ期待通りの結果になります
のがおかしい気がするんだが。実際こっちで検証してもエラーになってる
ちょっと環境書いてみて
2023/02/13(月) 03:20:36.33ID:COtuPGR00
Sub test()
a = 0.2
b = 0.4
If a + b = 0.6 Then
Debug.Print "A"
Else
Debug.Print "B"
End If
End Sub

これってAじゃね?
77デフォルトの名無しさん (スッップ Sdaa-GMxD)
垢版 |
2023/02/13(月) 07:05:23.93ID:HpzJjAlxd
>>76
Excelでは少数を厳密には表現できないから
0.1と書いても実際の値には0.12...みたいなのが入る
そのズレた値同士の足し算をズレた値と比べるからガタガタで合わなくなる
78デフォルトの名無しさん (ワッチョイ d301-0qku)
垢版 |
2023/02/13(月) 07:53:01.46ID:/kiwbSJJ0
>>76
きちんと型宣言すればちゃんと計算できる
詳しくは下を見た方が早い
https://excel-ubara.com/excelvba4/EXCEL_VBA_427.html#:~:text=Single%EF%BC%88%E5%8D%98%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E5%9E%8B%EF%BC%89%E3%81%AF4%E3%83%90%E3%82%A4%E3%83%88,%E7%99%BA%E7%94%9F%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%99%E3%80%82
79デフォルトの名無しさん (アウアウウー Sa4f-qaxQ)
垢版 |
2023/02/13(月) 10:13:40.33ID:QGUistpWa
>>76
ほんとだよく気付いたね って言ってほしいのか?
80デフォルトの名無しさん (ワッチョイ ff35-fTjZ)
垢版 |
2023/02/13(月) 10:18:31.40ID:86tN/4J60
すみません、マクロスレに誘導されてきました。教えてください
【1 OSの種類         .】 Windows**
【2 Excelのバージョン   】 Excel16.0
【3 VBAが使えるか    .】 はい
【4 VBAでの回答の可否】 可
◆やりたいこと
データモデルに値を格納し接続先を作成している
その接続先にあるリストを、検索フォーム、コンボボックスなどのデータソースにしたい
◆補足情報とし調べがついてること
・ピボットテーブルにはビボットテーブル→データモデルからで設定できた
・選択リストもINDIRECT関数で設定できた
・コンボボックスや検索フォームは、RowSourceTypeにテーブルクエリーを設定
・RowSourceプロパティにテーブル名を設定
ここまではわかっていますが、うまく設定ができません

具体的には、下記コードでエラーが出ます
実行時エラー‘13’
型が一致しません

エラーの出たコード
Privets Sub UserForm1 Initialize() {
Me.ComboBox1.RowSourceType = “Table/Query”
Me.ComboBox1.RowSource = “syamei1”
}

上記のコードの書き方、サンプルコードがあれば教えて下さい。よろしくお願いします
81デフォルトの名無しさん (ワッチョイ ff35-fTjZ)
垢版 |
2023/02/13(月) 10:21:58.10ID:86tN/4J60
連投すみません
コンボボックスじゃなくても構いません
やりたいことは大量のデータをもとに入力用のポップアップウインドウを作りたいです
レコードが合計で100万以上あり、重たくなるのを避けるために、データモデルの概念を知り、それで入力フォームを作ろうとしています
その方法でコンボボックスを見つけましたが、元となるデータソースがデータモデルの接続先から選べるなら、コンボボックスの形式じゃなくても構いません

入力規則で選択リストの値を持ってくることはできましたが、レコード件数が多いので、フォームで出したいと思っています

よろしくお願いします
82デフォルトの名無しさん (アウアウウー Sa4f-qaxQ)
垢版 |
2023/02/13(月) 11:40:19.98ID:GyFZ7uvya
Privets ?
83デフォルトの名無しさん (ワッチョイ ff35-fTjZ)
垢版 |
2023/02/13(月) 14:18:20.91ID:86tN/4J60
スマホ手打ちなので誤字は勘弁を
2023/02/13(月) 17:29:24.70ID:pezzuKY30
スマホで5ちゃん見てる人も多くなったのか
85デフォルトの名無しさん (アウアウウー Sa4f-qaxQ)
垢版 |
2023/02/14(火) 11:37:45.99ID:nNkhowbBa
拙者も携帯なので試せないでござるよ
86デフォルトの名無しさん (アウアウウー Sa4f-mhYO)
垢版 |
2023/02/14(火) 13:19:18.08ID:YTnfnco6a
現場で使えるテクニック満載のVBAの本を教えて下さい。
2023/02/14(火) 22:18:21.54ID:h0+uN4JM0
見てどうする?
現場に活かせるとは限らんぞ
88デフォルトの名無しさん (ワッチョイ aff9-UHi0)
垢版 |
2023/02/15(水) 09:38:23.37ID:dWAC20qI0
syamei1ってテーブルを指定してるようだけど
ちゃんとテーブルが存在してるの?
RowSourceでクエリやsql指定してみたら?
2023/02/15(水) 19:02:02.67ID:8XlBz3tg0
>>87
活かせる現場に転職するんじゃね
90デフォルトの名無しさん (ワッチョイ c619-xn9B)
垢版 |
2023/02/15(水) 19:27:38.40ID:HlAv3bv30
ネットが見れない環境なんかね?
銀行系ではよくある話だけど
2023/02/15(水) 19:39:09.60ID:UoMCmZrt0
絆創膏テクニック的な本はたくさん出ているでしょ
2023/02/15(水) 20:32:13.82ID:8XlBz3tg0
銀行でお金の計算を初心者が本見ながらEXCELのVBAで作ってるとか
そんな銀行やばくね
2023/02/16(木) 02:33:56.63ID:v5+0ZrcQ0
ヤバいよそれは。
思い出したけど、どこかの銀行がATMの不具合出した事故を思い出したわ。
それと同じようなトラブルになるのでは?
94デフォルトの名無しさん (ワッチョイ a705-0qku)
垢版 |
2023/02/16(木) 14:14:15.80ID:TeVuhO500
Excel 365なんだが
ActiveXのコンボボックスをシートに配置すると
ブックを閉じるときにコンボボックスのChangeイベントが発生して
Changeイベントのコードが実行されるんだが、なんで閉じるときに発生するん?
バグじゃねーの?
95デフォルトの名無しさん (スププ Sdaa-GKAg)
垢版 |
2023/02/16(木) 17:40:38.79ID:ImcZX1+Nd
アクティブXコントロールでボタン作ると、ボタン押した時にボタン内の文字が左に寄るのですが、これは治せるのでしょうか?
2023/02/16(木) 17:44:23.49ID:IvN11mYG0
ActiveXオブジェクトは、自分(Application)のオブジェクトに見えても、実は外部のオブジェクトです
Application イベントの扱いで記述不足や漏れが無いか、プロパティの見直しなどしてみるかコードを貼ってみるなり
2023/02/16(木) 20:35:33.62ID:v5+0ZrcQ0
ActiveXってExcelで使わない方が良いみたいな記事(日経PC)で見た記憶ある
98デフォルトの名無しさん (ワッチョイ a705-0qku)
垢版 |
2023/02/17(金) 07:12:43.98ID:WORa0xXL0
ActiveXはExcelシートで使うもんじゃないってのは今でも定石!
99デフォルトの名無しさん (スププ Sdaa-GKAg)
垢版 |
2023/02/17(金) 10:04:33.80ID:o2LVTB4Vd
https://answers.microsoft.com/ja-jp/msoffice/forum/all/office-2016-の-activex/81aa0b17-2f60-49c3-83f7-02c164969f7c

Excel2016のバグなんですね
100デフォルトの名無しさん (スププ Sdaa-GKAg)
垢版 |
2023/02/17(金) 10:05:10.85ID:o2LVTB4Vd
https://answers.microsoft.com/ja-jp/msoffice/forum/all/office-2016-の-activex/81aa0b17-2f60-49c3-83f7-02c164969f7c
2023/02/17(金) 10:15:37.69ID:znCeXLfL0
そんな古いVer使い続けるなよ スタンドアロンで一台こっきりならまだしも
2023/02/17(金) 15:42:35.67ID:WFsPqw+S0
検索で例えば「あ」という文字をすべて探し出して
その一文字前を選択したいんですがどうすればいいですか?
Selection.Find
 .Text = "あ"
 Selection.Words.First.Previous.Select
としてみましたがうまく行きませんでした
カーソルのある前の文字が選択されます
2023/02/17(金) 16:30:19.83ID:KwkbTkoud
>>102
複数の選択ができると思ってんのか?
2023/02/17(金) 17:31:12.72ID:WFsPqw+S0
>>103
できないんですね…VBA触ったの今日が初めてなもので
最終的には"あ"の一文字前だけをフォント変更したいんですがどういう実装ならできそうか分かりませんか?
2023/02/17(金) 20:35:48.06ID:clT0gqvf0
>>104

自分なら検索して見つかったセル毎に
「あ」が何文字目にあるかを取得し、
その1文字前のフォントを変更するというふうに組む。
2023/02/17(金) 20:59:53.94ID:WFsPqw+S0
>>105
ありがとうございます
けど"あ"が複数あるセルも多いので…複数回走査したらループ終わらなくなりますし
"あ"は目印として入れてあるだけで最後にまとめて消すつもりだったんですが
一回フォント変更の処理したらそこの"あ"を消してもう一度検索がいいんでしょうか…
107デフォルトの名無しさん (スプッッ Sd4a-GMxD)
垢版 |
2023/02/17(金) 22:23:30.64ID:v2XGnFXnd
>>106
Mid( Range.value, x)で
セル内のx文字目から後ろを切り出せる
Instr( Mid( Range.value, x), z)で
セル内のx文字目から切り出した中で文字列zが何文字目にくるのか知ることができる
Range.characters(x, y).Fontで
セル内のx文字目からy文字分みたいな一部指定でのフォント変更が出来る

これらのxやyをForで変更しながら処理すればいけると思う
2023/02/17(金) 22:57:47.99ID:WFsPqw+S0
>>107
あああなるほどなるほど
仰ってる意味はギリわかるんですけどコードいじるのほぼ10年ぶりとかなんでハードル高い~~~
どうにかがんばってみます……
ありがとうございました
2023/02/18(土) 11:21:39.71ID:wyxXLbRL0
>>108
コードを書いてみた。
所定のフォントを変えた後、最後にまとめて「あ」を空白に置換させている。

Sub findあ()
 Dim foundcell As Range, firstcell As Range, target As Range, Num As Long, flag As Boolean
 Set foundcell = Cells.find(What:="あ")
 If foundcell Is Nothing Then Exit Sub
  Set firstcell = foundcell:Set target = foundcell
  Do
   Num = InStr(foundcell, "あ")
   If Num > 1 Then
    flag = False
Do
If flag = False Then Num = 0
Num = InStr(Num + 1, foundcell, "あ")
If Num = 0 Then Exit Do
foundcell.Characters(Start:=Num - 1, Length:=1).Font.Name = "BIZ UDゴシック":flag = True
Loop
End If
Set target = Union(target, foundcell)
Set foundcell = Cells.FindNext(foundcell)
Loop Until foundcell.Address = firstcell.Address
target.Replace What:="あ", Replacement:=""
End Sub
2023/02/18(土) 11:39:38.68ID:wyxXLbRL0
途中で書き込んでしまったので
もし使うならインデント調整して下さい
2023/02/18(土) 18:22:51.48ID:oiEmQBhiM
>>109-110
ご親切にありがとうございます!!
有り難く使わせていただきます
112デフォルトの名無しさん (ワッチョイ 2302-3nnD)
垢版 |
2023/02/19(日) 13:44:33.87ID:E1njzG6f0
次のようにA列にid番号、B列に削除されるid番号あります。
A,B
1,3
2,5
3,7
4,
5,
6,
7,
8,
9,

C列にAからBの番号を除外したものが残ります。
C,
1
2
4
8
9

これを実現するのに、みなさんならセル関数を使いますか?VBAを使いますか?
113デフォルトの名無しさん (ワッチョイ 9b8c-DN/W)
垢版 |
2023/02/19(日) 14:09:46.37ID:fQjaN3Vg0
バージョンは
2023/02/19(日) 14:50:51.24ID:E1njzG6f0
ver2019です。
2023/02/19(日) 15:46:46.73ID:IrwBul5G0
手動も含めて一番都合がいいのを使う
2023/02/19(日) 16:33:34.29ID:E1njzG6f0
ありがとうございます。慣れないですがVBAで行うことにしました。
117デフォルトの名無しさん (ワッチョイ 2302-3nnD)
垢版 |
2023/02/19(日) 16:36:15.42ID:E1njzG6f0
以下の実行が通りません。
If init_id(i) = del_id(j) Then
の個所でインデックスの範囲外というエラーがでました。
配列に対して添字を()しているのが問題でしょうか?

Sub 次の問題()
Dim totalQuestions As Long, pastQuestions As Long, Nextnum As Long, n As Long
Dim init_id() As Variant, del_id() As Variant

totalQuestions = Worksheets("Play").Cells(Rows.Count, 1).End(xlUp).Row - 1
Randomize
Nextnum = Int(totalQuestions * Rnd + 1)
n = Worksheets("arrData").Cells(Rows.Count, "B").End(xlUp).Row + 1
Worksheets("arrData").Cells(n, "B") = Nextnum

init_id = Worksheets("Play").Range(Worksheets("Play").Cells(2, 1), Worksheets("Play").Cells(totalQuestions + 1, 1)).Value

pastQuestions = Worksheets("arrData").Cells(Rows.Count, 2).End(xlUp).Row - 1
del_id = Worksheets("arrData").Range(Worksheets("arrData").Cells(2, 2), Worksheets("arrData").Cells(pastQuestions + 1, 2)).Value

Dim i As Integer, j As Integer
For i = 1 To totalQuestions
For j = 1 To pastQuestions
If init_id(i) = del_id(j) Then
Debug.Print init_id(i).Value
End If
Next j
Next i

End Sub
2023/02/19(日) 16:40:27.54ID:E1njzG6f0
念のため、chatGTPはあてにならなかったです。
2023/02/19(日) 17:24:19.98ID:ZehIwlnC0
>>117
Integerだからだろ
2023/02/19(日) 17:30:57.52ID:E1njzG6f0
ありがとうございます。Longにしてもダメでした。
根本的に配列の扱いが間違っているような感じですが、
それがよくわかりません。
121デフォルトの名無しさん (ワッチョイ 1501-rVJW)
垢版 |
2023/02/19(日) 17:39:18.41ID:j3UrUaev0
>>120
init_id = Worksheets("Play").Range(Worksheets("Play").Cells(2, 1), Worksheets("Play").Cells(totalQuestions + 1, 1)).Value

del_id = Worksheets("arrData").Range(Worksheets("arrData").Cells(2, 2), Worksheets("arrData").Cells(pastQuestions + 1, 2)).Value
でinit_idとdel_idにセルの値を配列として代入しているけど、これは2次元配列として代入している
だからinit_id(i)という一次元配列は存在しない
init_id(1,1)とかinit_id(2,1)の二次元配列として存在している
よってinit_id(i)は存在しませんってエラーが出てる
ローカルウインドで確認するといい
2023/02/19(日) 17:44:28.85ID:E1njzG6f0
ありがとうございました。よくわかりました。
なんとか1次元の配列を作りたいと思います。
セルデータから簡単に配列つくれるということでこの作り方になったのですが。
列番号を1つにすれば1次になるかと浅はかでした。。
2023/02/19(日) 18:07:25.25ID:xzOvW7kvd
配列よりDictionaryの存在チェックで判定する方が簡単そうだけどなぁ
2023/02/19(日) 18:17:57.66ID:FtkTxk830
>>112
VBAならこんな感じか。
後、C列に6がないのは記入漏れ?

Sub C列に書く()

Dim i As Long, cnt As Long, dRange As Range
Set dRange = Range("B1:B3")
cnt = 1

For i = 1 To 9
If WorksheetFunction.CountIf(dRange, Cells(i, 1)) = 0 Then
Cells(cnt, 3) = Cells(i, 1)
cnt = cnt + 1
End If
Next i

End Sub
2023/02/19(日) 18:24:49.89ID:E1njzG6f0
>>124
ありがとうございます。やろうとしていたコードよりシンプルです。
2023/02/19(日) 18:28:42.83ID:E1njzG6f0
>>124でおしえていただいた方法で進めたいのですが。
これで、エラーがでたのはなぜでしょう?
Sub 次の問題()
Dim totalQuestions As Long, pastQuestions As Long, Nextnum As Long, n As Long
Dim init_id() As Variant, del_id() As Variant

totalQuestions = Worksheets("Play").Cells(Rows.Count, 1).End(xlUp).Row - 1
Randomize
Nextnum = Int(totalQuestions * Rnd + 1)
n = Worksheets("arrData").Cells(Rows.Count, "B").End(xlUp).Row + 1
Worksheets("arrData").Cells(n, "B") = Nextnum
pastQuestions = Worksheets("arrData").Cells(Rows.Count, 2).End(xlUp).Row - 1

Dim i As Integer
For i = 1 To totalQuestions
init_id(i) = Worksheets("Play").Cells(i+1, 1)
Next i
For i = 1 To pastQuestions
del_id(i) = Worksheets("Play").Cells(i+1, 1)
Next i

End Sub
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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