X



Excel VBA 質問スレ Part63

■ このスレッドは過去ログ倉庫に格納されています
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のこの
■ このスレッドは過去ログ倉庫に格納されています

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