Excel VBA 質問スレ Part63

■ このスレッドは過去ログ倉庫に格納されています
2019/09/16(月) 19:34:59.04ID:emfTAhXr0
!extend:checked:vvvvv:1000:512

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

※前スレ
Excel VBA 質問スレ Part62
https://mevius.5ch.net/test/read.cgi/tech/1561303297/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/11/13(水) 20:10:53.70ID:YFdnwmN50
何だそりゃww
可視セル以外は計算しちゃいけないのか?
計算してもいいなら、全部配列に入れて計算しちゃえば?
2019/11/13(水) 20:15:05.26ID:YIACCBmB0
>>677
早速の返信ありがとうございます。
可視セル以外は変更してはだめなんです。
後だしになるんですが、黒でフィルターしたらC✕D、白ならC-Dと処理が違うためです。
2019/11/13(水) 20:15:12.55ID:6AWs9S2tr
>>676
B列にはじめから計算式入れとけば良いんじゃ
2019/11/13(水) 20:23:26.06ID:1iCOkal60
>>678
フィルタいらなくない?
色で計算変えればいいだけじゃない?
681デフォルトの名無しさん (ササクッテロ Sp0f-jIeE)
垢版 |
2019/11/13(水) 21:12:54.98ID:xS2J4sOcp
質問失礼します。
vbaからc++のdllへ引数を渡してc++で処理し、配列をvba側に返したいです。
引数で渡すものは、配列ではありません。

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

お願いします。
2019/11/13(水) 21:45:08.38ID:YIACCBmB0
>>679
>>680
ボタンを押した時だけ変更するようにしたいので、式を入れるのは難しいかと思います。
またまた後だしになるんですが、他にも色々ボタンを配置して、このボタンを押すとB=Cとしたり、こっちのボタンを押すとB=1.1*Dという感じにしています。
2019/11/13(水) 21:50:01.18ID:1iCOkal60
>>682
だからボタン押した時色によって計算変えればいいじゃないかと
2019/11/13(水) 22:20:19.63ID:nTBpuTY40
このスレって北海道のハゲのおっさん来てるの?
2019/11/14(木) 20:59:40.88ID:17R2nmHB0
>>682
色以外にフィルタをかけられる要素は無いの?
あるなら、一旦解除して配列に入れて、該当行だけ計算して、またセルに戻して再度フィルタ。

>>681
普通に受け取れると思うけど。
ByRef的に受け取るの?
2019/11/15(金) 05:48:17.81ID:yBQ3/wSNr
>>676
for eachループを
range(cells(2,2),cells(10000,2).end(xlup)).specialcells(略).formula="=C2*D2"
2019/11/15(金) 06:53:06.51ID:PYCwQdmA0
このスレって北海道のハゲのおっさん来てないの?
2019/11/15(金) 08:30:23.58ID:1eiULMc8H
>>687
こんなとこでハゲ友おっさんずラブっすかw
2019/11/15(金) 09:09:18.54ID:kdsqvzvNd
>>671
昔、某掲示板で質問してた奴が、欲張らずに基礎からやった方が良いと言われてエキスパート持ってるんですけどねと言ってた人がいた。
そんな感じかな。
2019/11/15(金) 09:16:55.98ID:QHXNBkQLM
vbaスタンダードの教材の目次見たけど基礎というか普通に初心者向けという感じがした
逆にこういう内容飛ばしてどうやって使ってるんだろう
2019/11/15(金) 18:37:41.87ID:C4049C6d0
基礎からやるの、良いと思うけどな。
基礎を無視した俺は、ADOもWinAPIもUiAutomationも使えるが、
プロシージャの意味を20年くらい知らなかったぞ。
2019/11/15(金) 18:58:40.00ID:PYCwQdmA0
スーパーつるっぱげ
2019/11/16(土) 13:07:26.06ID:sIw2xRM6a
VBAスレ民はマジで頭弱めだな
694微糖 (ワッチョイ 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
695微糖 (ワッチョイ 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>

///////////////////////////////
こんな感じです。どうぞよろしくお願いいたします。
2019/11/16(土) 20:06:56.33ID:sGW0vpYA0
>>694
関数の結果を入れる変数が抜けてる
コートは精査してないけど、とりあえずこれでいいんじゃね?
s1 = Replace(s1, "tabledata1", excelldata1)
2019/11/16(土) 20:08:04.72ID:TSYRRFtw0
>>694
普通はエラー出ない
698微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:10:44.84ID:Owph/MuN0
すいません。できた 私はあほでした。
s1 = Replace(s1,"tabledata1", excelldata1)
で出力できました。
699微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/16(土) 20:11:37.38ID:Owph/MuN0
みんな、早い。。ありがとう。。
2019/11/17(日) 03:29:18.67ID:2cbrHYYdx
レンダリングエンジンとしてExcelを使ってるの?
つらすぎるなそれは
2019/11/17(日) 04:16:20.60ID:ssaK56un0
レンダリングエンジンの意味間違ってるよ
2019/11/17(日) 06:32:04.83ID:xHzCYEPp0
使ってるかどうかは、これだけじゃ判断できない
可能性はあるけど断言はできないから
703微動 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 11:35:29.77ID:7JpkRiZ80
わたくしのことですか??

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

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

思ってるとこでし。
2019/11/17(日) 11:38:28.01ID:iKuebie5a
Atomとか久しぶりに聞いたな
VSCodeに完全敗北して利用者がほとんど乗り換えた挙げ句に開発元がMSに買収されて完全に開発も終わった死んだエディタだよ
705微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 11:47:05.51ID:7JpkRiZ80
そんなこといわなくても、、、
web系は、sublimetext か Atom が多いと思う。まれに秀丸さんもいるお。
2019/11/17(日) 11:51:44.83ID:+9SinR1u0
>>705
そいつは触らなくていいやつだよ
707微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 11:52:22.26ID:7JpkRiZ80
ここらへんにいらっしゃるかたは
R列が何番目か直ぐに頭にでてくるのかしらん。

セル選択したら、行列番号がすぐわかる表示設定あるといいですねえ。
2019/11/17(日) 11:52:40.84ID:RwF92niuM
いつの話だよ
Web系のAtomユーザーはほとんどVSCodeに乗り換えたよ
2019/11/17(日) 12:25:47.38ID:sTIVZZab0
>>707
エクセル 列の表示を数字とアルファベットで切り替える
https://www.tipsfound.com/excel/01204
2019/11/17(日) 12:31:12.53ID:Sxy4Nq05x
>>707
言ってることがよくわからんけど↓みたいにVBEでコンソール出力するのは駄目なの?
?Selection.Item(1).Row & ", " & Selection.Item(1).Column
711微糖 (ワッチョイ 2eda-zGDE)
垢版 |
2019/11/17(日) 12:46:43.50ID:7JpkRiZ80
いろいろ提案ありがとうございます。
普通に対応表を手元においときます。
2019/11/17(日) 13:14:49.52ID:+9SinR1u0
>>707
A1とR1C1表示を切り替えられるショートカット作った
713デフォルトの名無しさん (ワッチョイ e9f1-Xz/Q)
垢版 |
2019/11/17(日) 13:37:03.64ID:3mRPp1GD0
まれに禿もいるよ
714デフォルトの名無しさん (ワッチョイ e9d2-gqPR)
垢版 |
2019/11/17(日) 14:08:51.89ID:1WE0juC20
>>707
1行目に連番を振っておく
2019/11/17(日) 15:12:07.26ID:6UewZHZj0
>>707
機能はいらんかな。見たくなったらcolumn()入れてる
2019/11/17(日) 18:02:42.14ID:iBcgGvQr0
北海道のグラサンの禿はここにきてないの?
2019/11/17(日) 19:02:54.92ID:FdUgz5q60
俺も=Column()入れてるわ。
ていうかね、何でどっちか片方だけなんだよ。
A(1)、B(2)とか両方表示するモード付けりゃいいのに。
2019/11/17(日) 19:28:55.74ID:6UewZHZj0
>>717
おーそれいいね
ややこしかったらツールチップみたいに、ポイントした時に出てくるとかでも良い
2019/11/17(日) 19:33:09.97ID:Sxy4Nq05x
現状自作するしかないわな
2019/11/17(日) 19:38:26.25ID:SNu9npot0
むしろ列番号が必要なことって少なくね?
2019/11/17(日) 19:43:53.48ID:6UewZHZj0
indirectやVBAで古いデータを整備する時にたまに必要になる
722デフォルトの名無しさん (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
2019/11/17(日) 22:40:14.20ID:ssaK56un0
上から順番に足して2列目にその合計を表示させればいいですよ
2019/11/17(日) 22:55:50.76ID:Sxy4Nq05x
>>722
ワークシート関数じゃ駄目なの?
2019/11/17(日) 23:11:53.16ID:+9SinR1u0
>>722
左のセル+上のセル
2019/11/17(日) 23:14:14.11ID:+9SinR1u0
A2から対象行までを合計
2019/11/18(月) 00:38:18.28ID:NH6dP3qE0
for i = 1to10
v=v+cel(i,1)
cel (i,2)=v
next
みたいな感じ?
2019/11/18(月) 00:45:00.05ID:+I12EpJt0
なんだcelて
ちゃんと書けボケナス
729デフォルトの名無しさん (ワッチョイ 6d8e-2sI3)
垢版 |
2019/11/18(月) 01:27:00.60ID:pxOyK5Ui0
>>722
馬鹿は死ねよ
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]
731デフォルトの名無しさん (ドコグロ 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
732デフォルトの名無しさん (ドコグロ 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
2019/11/18(月) 15:42:28.46ID:cwF5jgoMd
>>707
VBEのメニュー上にテキストボックス作って数値とアルファベット相互変換する奴作れば。
2019/11/18(月) 15:43:19.48ID:cwF5jgoMd
>>720
寧ろ列番号の方が必要。
2019/11/18(月) 15:53:04.73ID:cwF5jgoMd
>>722
Range("B1:B10").Value="=SUM($A$1:$A1)"
'関数残したくなければ下を追加
Range("B1:B10").Value=Range("B1:B10").Value
2019/11/18(月) 17:07:56.73ID:S9/8fJfLM
>>734
どんなときに必要なの?
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
2019/11/18(月) 18:25:23.23ID:cwF5jgoMd
>>736
普通はCells(i, j)を使うから
2019/11/18(月) 18:33:30.81ID:cwF5jgoMd
>>737
Worksheets(1)じゃ駄目なん?
2019/11/18(月) 19:06:26.91ID:S9/8fJfLM
>>738
まさかと思うけど、F1~X1のセルの処理を
For C = 6 To 24 ' F列からX列
~.Cells(1, C).~
Next
みたいにコーディングしてるの?
741デフォルトの名無しさん (ワッチョイ 0d7c-RQWt)
垢版 |
2019/11/18(月) 19:14:56.88ID:sS2XhUCG0
vbaを勉強してるのですが、specialcellsとusedrangeの違いが分からないのですが、どんな時に使い分けるのですか?
2019/11/18(月) 19:45:04.18ID:TkavPukF0
どっちも普段使わない
2019/11/18(月) 19:45:09.69ID:cwF5jgoMd
>>740
そんなものは内容による。
Range("C1")のような表現よりも数学的、座標的表現であるCellsの方を使うことの方が多いと言ってる。
2019/11/18(月) 19:46:05.14ID:HkQQG0+L0
>>737
シート名かシートの順番を固定しないと無理
2019/11/18(月) 19:49:12.48ID:HkQQG0+L0
>>741
specialcellsは選択範囲から取得される
usedrangeは選択範囲関係なくシート全体から取得される
2019/11/18(月) 19:50:38.34ID:cwF5jgoMd
>>744
シート1つしか無いと思う。
文が曖昧だから必ずそうとは言えないが。
2019/11/18(月) 19:55:46.17ID:S9/8fJfLM
>>743
お前がそうだというだけの話なのね
2019/11/18(月) 19:56:31.57ID:cwF5jgoMd
>>747
そうだよ。
2019/11/18(月) 19:58:05.76ID:cwF5jgoMd
今までの経験上、組める奴は同意見が多いけどね。
2019/11/18(月) 20:05:00.70ID:NN3IfGCl0
>>740
列方向だけに伸ばす事は少ないけど、

for k = 1 to 3
for i = 1 to 最終行
cells(i,k)
next
next

みたいに二重ループにすることはたまによくあるよ
2019/11/18(月) 20:05:54.63ID:TkavPukF0
>>737
シートが1枚しか無いならブック開いてからアクティブシート取得すればいいのでは
2019/11/18(月) 20:08:35.28ID:OvcXdQbJd
Set
2019/11/18(月) 20:22:40.48ID:lwVIqPwD0
>>748
ならなんの問題もないな

>>749
お前の周りの話だよね?

>>750
いや、その例で
for k = 1 to 3 ' A列~C列
って書いてるってことね
2019/11/18(月) 21:22:26.89ID:cwF5jgoMd
>>753
俺の周りって結構広いんで。
755デフォルトの名無しさん (ワッチョイ e194-qxAY)
垢版 |
2019/11/18(月) 21:40:37.27ID:/hFPyym30
Rubyなら一行で書ける程度の事をVBAは面倒だね
2019/11/18(月) 22:02:21.62ID:lwVIqPwD0
>>754
はいはいw
2019/11/18(月) 22:39:37.88ID:VbUqW+zkx
俺はCells派
任意のセル範囲内での位置座標を相対指定できてめちゃくちゃ便利
Cells(i)もCells(i, j)もよくつかうしSelection.Cells〜とかよくやる
2019/11/18(月) 23:25:47.41ID:NH6dP3qE0
>>728
携帯で打ってるのに無理ゆうなよ。
2019/11/19(火) 06:07:21.04ID:hrMAmFVPa
>>754
ウエストな
2019/11/19(火) 09:42:21.51ID:i5CWN+mw0
>>754
カエルかな?
2019/11/19(火) 12:42:00.23ID:QxFuappz0
>>741
SpeciallCellsのほうはユーザー定義関数で使うと不具合あったはず
762デフォルトの名無しさん (オッペケ Sr11-bUGG)
垢版 |
2019/11/19(火) 22:43:20.17ID:UG4gZLw4r
>>740
RangeをVariantに代入して
For c = 1 To Ubound(Variant)
Variant(1,c)...
が一番楽
だけどRangeが1セルだけの場合上手く代入できない気がする
2019/11/20(水) 13:27:25.20ID:IaTx24D1d
>>762
>>740
いや、だからさ、>>735みたいにしたりするし、その時によるんだよ。
行、列共に多少なりとも組める奴ならアルファベットでアクセスすることは少ないというだけ。
764デフォルトの名無しさん (アウアウウー 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の部分ってこのサブルーチンだけを動かすようなマクロの場合いらなくね?
765デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/21(木) 15:37:08.52ID:LUwjW7Cja
>>764
間違えたdimでRE変数宣言するのいらなくない?
それとは別の話でset RE nothingはこのサブルーチンしか動かさない場合は必要なくない?
766デフォルトの名無しさん (オッペケ Src5-/8GO)
垢版 |
2019/11/21(木) 16:45:06.69ID:CoNvnJper
>>765
変数そのものがなくても良いって話なのか、宣言がいらないって話なのか?
まあどっちもやりようによってイエスだが、それが推奨されるかは別の話
767デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/21(木) 17:16:22.54ID:LUwjW7Cja
>>766
プログラム的に何か考慮してるのか聞きたい
プロジェクトでどうするべきか見たいなところは興味ない
768デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/21(木) 17:22:58.39ID:LUwjW7Cja
vbaの設計的にはSet RE = CreateObject("VBScript.RegExp") これだけで初期化できてるからdimで宣言する必要があるのかコンピューターサイエンスサイドの意味で聞きたい
2019/11/21(木) 23:25:18.32ID:BtgKOXu8d
普通は変数宣言を強制するようになってるだろ。
2019/11/22(金) 00:36:07.32ID:kJTMU1Ov0
スモリートインハゲラクター
2019/11/22(金) 01:53:36.59ID:NJe7bE9qx
>>768
モジュールレベルで変数宣言を強制している場合にはプロシージャ内のDimで宣言していないとコンパイルエラーになる
型指定なしのDim宣言ってのは実際にはVariant型変数の宣言なので、代入時に型評価をしているだけだけどね
RegExp型のメモリ領域をDim宣言時に確保するとなると参照設定が必要でそれはそれでまた別の問題が生じる
2019/11/22(金) 11:54:02.74ID:L6bND2U2d
クラスモジュールを使ってオブジェクト指向(厳密には違うらしいですが…)を理解したいと思っています
Newでオブジェクト生成して、get set letを使いながらプログラムを書くという認識で合っているでしょうか?
773デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:01:14.10ID:BVLtoDL5a
>>771
モジュールレベルで変数宣言を強制している場合には必要なのね、ありがとう良くわかった。
set RE = nothingなんだけどこのサブルーチン実行完了したらメモリとか解放されるからnothingやらなくてもスタック領域占有しないと思ってるんだけど実際のところどうなの?そもそも"VBScript.RegExp"の占有ってスタック領域であってる?
そもそもVBAのこの
2019/11/22(金) 12:14:16.35ID:rCku/67RM
発達障害か何かか?
775デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:16:14.12ID:BVLtoDL5a
>>774
教えてよ知ってるなら質問してたからこれも
776デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:19:40.92ID:BVLtoDL5a
実際に正常終了する前提ならset RE = nothingしなくてもメモリリーク起きないのか知りたい
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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