探検
Excel VBA 質問スレ Part51
レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん (スププ Sd4a-O827)
2017/11/08(水) 11:26:30.13ID:+KUB1/9hdスレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/
※前スレ
Excel VBA 質問スレ Part50
http://mevius.2ch.net/test/read.cgi/tech/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
845デフォルトの名無しさん (スプッッ Sdbf-jEmF)
2018/01/04(木) 18:02:17.19ID:HiTEnEcXd >>842
ありがとうございます!
ありがとうございます!
846デフォルトの名無しさん (スップ Sdbf-dCp1)
2018/01/04(木) 18:13:43.61ID:uhyB+DSmd847デフォルトの名無しさん (スップ Sdbf-dCp1)
2018/01/04(木) 18:23:20.07ID:uhyB+DSmd すいません、間違えて書き込んでしまいました
>>844
Bがtrueなら、というのはどうやって指定すればいいですか?
範囲指定でがっつりやると、指定した範囲に一つでもtrueがあるとカウントしてしまって結局全部をカウントしてしまうんです
>>844
Bがtrueなら、というのはどうやって指定すればいいですか?
範囲指定でがっつりやると、指定した範囲に一つでもtrueがあるとカウントしてしまって結局全部をカウントしてしまうんです
848デフォルトの名無しさん (ワンミングク MMbf-OpPU)
2018/01/04(木) 18:27:59.94ID:iMxAIJokM >>826
何も難しく考えなくても、E列に=A&B&Cを入れて、E列を行ラベルにしてピボットテーブルで集計するだけで出来るよ。
ABC列をもどしたいならINDEX,MATCHで引っ張って来ないといけないけども、日々エクセル使ってる人なら手慣れたものだと思う。と言うか慣れておくと色々便利。
詳しい解説いるならする
何も難しく考えなくても、E列に=A&B&Cを入れて、E列を行ラベルにしてピボットテーブルで集計するだけで出来るよ。
ABC列をもどしたいならINDEX,MATCHで引っ張って来ないといけないけども、日々エクセル使ってる人なら手慣れたものだと思う。と言うか慣れておくと色々便利。
詳しい解説いるならする
849デフォルトの名無しさん (アウアウイー Sacf-rQ0k)
2018/01/04(木) 18:58:58.92ID:IwnGnNnba850デフォルトの名無しさん (ワッチョイ ef9d-/oj5)
2018/01/05(金) 02:37:52.28ID:UixpopG00 フィルタとCOUNTIFで良い気がするが
どうしてもVBAでやりたいのか?
どうしてもVBAでやりたいのか?
851デフォルトの名無しさん (ワッチョイ efe7-eFUV)
2018/01/05(金) 17:45:28.92ID:Kfn/8I4m0 HTMLソースで
<a href = URL1</a>
<br />**** ← 4桁の特定の数字が入る
<a href = URL2>予約中</a>
<a href = URL3>[取消]</a><br /><a href = URL4>[訂正]</a>
上記の4桁の数字とURL以外同様のソースが全部で10個あるページがあり、C5セルに4桁の数字を入れ、それに対応したURL3のリンクをクリックしたいのですが、どうすれば可能でしょうか?
IEでそのページまで飛ぶのは問題ないのですが、aタグのインナーテキストが4桁の数字以外共通なためForとGetElementsByTagNameとの組み合わせでクリックできないので何か手段があれば教えて頂きたいです。
<a href = URL1</a>
<br />**** ← 4桁の特定の数字が入る
<a href = URL2>予約中</a>
<a href = URL3>[取消]</a><br /><a href = URL4>[訂正]</a>
上記の4桁の数字とURL以外同様のソースが全部で10個あるページがあり、C5セルに4桁の数字を入れ、それに対応したURL3のリンクをクリックしたいのですが、どうすれば可能でしょうか?
IEでそのページまで飛ぶのは問題ないのですが、aタグのインナーテキストが4桁の数字以外共通なためForとGetElementsByTagNameとの組み合わせでクリックできないので何か手段があれば教えて頂きたいです。
852デフォルトの名無しさん (アウアウカー Sa4f-nLZj)
2018/01/05(金) 21:06:25.46ID:UyFZaUswa853851 (ワッチョイ efe7-eFUV)
2018/01/05(金) 21:25:01.57ID:Kfn/8I4m0 >>852
あ、確かに。書き間違えました。下記のコードだと10個のリンクのうち、一番上にあるやつをクリックすると思うのですが、
C5セルに入力した特定の4桁の数字の下にあるリンクをクリックしたいのです。
For Each obj In objIE.Document.getElementsByTagName("a")
If InStr(obj.innertext, "取消") > 0 Then
obj.Click
Exit For
End If
Next
あ、確かに。書き間違えました。下記のコードだと10個のリンクのうち、一番上にあるやつをクリックすると思うのですが、
C5セルに入力した特定の4桁の数字の下にあるリンクをクリックしたいのです。
For Each obj In objIE.Document.getElementsByTagName("a")
If InStr(obj.innertext, "取消") > 0 Then
obj.Click
Exit For
End If
Next
854デフォルトの名無しさん (ワッチョイ ef9f-hL1C)
2018/01/05(金) 22:16:41.06ID:vO88ak3C0 DOMに親要素とか隣の要素を見ていくのあったよね
あれで必要なだけ移動させればいいんじゃね
あれで必要なだけ移動させればいいんじゃね
855デフォルトの名無しさん (ワッチョイ ef9f-hL1C)
2018/01/05(金) 22:20:08.87ID:vO88ak3C0856デフォルトの名無しさん
2018/01/07(日) 08:20:46.08 >>843
VBAを使わずにExcelの計算式で書くとこうだよね。
・C列が「10」、B列が「○」の行を数えるなら
=COUNTIFS($C$2:$C$6,10,$B$2:$B$6,"○")
・C列が「10」、B列が空以外の行を数えるなら
=COUNTIF($C$2:$C$6,10)-COUNTIFS($A$2:$A$6,10,$B$2:$B$6,"")
これをVBAで書きたいなら、そのままワークシート関数を呼び出せばいい。
・C列が「10」、B列が「○」の行を数えるなら
With Worksheets("Sheet1")
dblCnt = WorksheetFunction.CountIfs(.Range("C2:C6"), 10, .Range("B2:B6"), "○")
End With
・C列が「10」、B列が空以外の行を数えるなら
With Worksheets("Sheet1")
dblCnt = WorksheetFunction.CountIf(.Range("C2:C6"), 10) - WorksheetFunction.CountIfs(.Range("C2:C6"), 10, .Range("B2:B6"), "")
End With
注:COUNTIFS関数はOffice 2007で追加されたので、2003とかでも動くようにするには
計算式なら配列数式を使うかダミーの結合列 (例: F列に =B2&”:”&C2)を使う必要があるし、
VBAなら自前で1行ずつループするFor文を書く必要がある。
VBAを使わずにExcelの計算式で書くとこうだよね。
・C列が「10」、B列が「○」の行を数えるなら
=COUNTIFS($C$2:$C$6,10,$B$2:$B$6,"○")
・C列が「10」、B列が空以外の行を数えるなら
=COUNTIF($C$2:$C$6,10)-COUNTIFS($A$2:$A$6,10,$B$2:$B$6,"")
これをVBAで書きたいなら、そのままワークシート関数を呼び出せばいい。
・C列が「10」、B列が「○」の行を数えるなら
With Worksheets("Sheet1")
dblCnt = WorksheetFunction.CountIfs(.Range("C2:C6"), 10, .Range("B2:B6"), "○")
End With
・C列が「10」、B列が空以外の行を数えるなら
With Worksheets("Sheet1")
dblCnt = WorksheetFunction.CountIf(.Range("C2:C6"), 10) - WorksheetFunction.CountIfs(.Range("C2:C6"), 10, .Range("B2:B6"), "")
End With
注:COUNTIFS関数はOffice 2007で追加されたので、2003とかでも動くようにするには
計算式なら配列数式を使うかダミーの結合列 (例: F列に =B2&”:”&C2)を使う必要があるし、
VBAなら自前で1行ずつループするFor文を書く必要がある。
857デフォルトの名無しさん (スプッッ Sdea-p8jN)
2018/01/11(木) 12:40:04.91ID:eKl5cJvJd コンボboxを使ってサジェスト機能みたいなことをしたくて作ってみたんだけど、1文字目はうまくいくんだけど2文字目以降打つとリストの一番上が乗ってきて使い心地が良くないんだけど、どうしたらいいですか?
コンボboxのリストのみをクリアするやり方もいまいちわかりません。
j=2
Tname.rist=array()
set MstSht=worksheets(″マスター″)
str_word=controls(″Tname″&j).value
for i=2toMstSht.cells(rows.count,6).end(xlup).row
if instr(ucase(MstSht.cells(i,6).value),ucase(str_word))=1 then
controls(″Tname″&j).additem MstSht.cells(i,6).value
end if
next
コンボboxのリストのみをクリアするやり方もいまいちわかりません。
j=2
Tname.rist=array()
set MstSht=worksheets(″マスター″)
str_word=controls(″Tname″&j).value
for i=2toMstSht.cells(rows.count,6).end(xlup).row
if instr(ucase(MstSht.cells(i,6).value),ucase(str_word))=1 then
controls(″Tname″&j).additem MstSht.cells(i,6).value
end if
next
858デフォルトの名無しさん (ワッチョイ 1188-/4a5)
2018/01/11(木) 19:23:41.06ID:WJjCr32Q0 エクセルの2003ですが、
並べて比較を使用した際にペアになっているブックと、
そのブックで表示されているシートを取得するには
どのように記述すればいいでしょうか。
並べて比較を使用した際にペアになっているブックと、
そのブックで表示されているシートを取得するには
どのように記述すればいいでしょうか。
859デフォルトの名無しさん (アウーイモ MM21-MNwA)
2018/01/11(木) 21:16:23.66ID:JbTpKTF6M >>858
何を言っているのでしょうか?
何を言っているのでしょうか?
860デフォルトの名無しさん (ワッチョイ 25d2-Un5q)
2018/01/11(木) 21:25:37.65ID:a2sLbYI50 世界教師マイトLーヤ「大暴落は日本からスタート」
http://rio2016.5ch.net/test/read.cgi/2chse/1512813686/l50
【マイトLーヤ】 米国債を売れ 【1200兆円】
https://medaka.5ch.net/test/read.cgi/eco/1515587891/l50
http://rio2016.5ch.net/test/read.cgi/2chse/1512813686/l50
【マイトLーヤ】 米国債を売れ 【1200兆円】
https://medaka.5ch.net/test/read.cgi/eco/1515587891/l50
861デフォルトの名無しさん (ワッチョイ e52b-Yq9l)
2018/01/12(金) 01:30:55.27ID:GWvM9lig0863デフォルトの名無しさん (ワッチョイ 79af-rWHv)
2018/01/12(金) 15:56:41.55ID:kdQVxAch0 0回目って何?
864デフォルトの名無しさん (ワッチョイ eab3-0PCX)
2018/01/12(金) 19:59:42.26ID:8L8z7qJh0 vbModelessで開いたUserForm上のTextBoxにSetFocusするようInitializeに記述しても効きません
これって無理なんですかね?
vbModelessを切るとフォーカスがちゃんとTextBoxに移るんですけどね
これって無理なんですかね?
vbModelessを切るとフォーカスがちゃんとTextBoxに移るんですけどね
865デフォルトの名無しさん (ワッチョイ 5e9f-QpsD)
2018/01/12(金) 23:20:03.95ID:Ln5WwMFr0 初期状態でフォーカスを当てたいなら
UserForm.Show vbModeless
UserForm.TextBox.SetFocus
とフォームを呼んでいるプロシージャ側に書く
フォームのイベントならActivateでどうでしょう
毎回フォームがアクティブになるたびフォーカスしちゃうけど
Initializeがなぜはしらないのかは知らない
UserForm.Show vbModeless
UserForm.TextBox.SetFocus
とフォームを呼んでいるプロシージャ側に書く
フォームのイベントならActivateでどうでしょう
毎回フォームがアクティブになるたびフォーカスしちゃうけど
Initializeがなぜはしらないのかは知らない
866デフォルトの名無しさん (ワッチョイ 5e9f-QpsD)
2018/01/12(金) 23:44:10.99ID:Ln5WwMFr0 実験してみたらInitializeは呼ばれてるけど
SetFocusだけがだめみたい
他のことは普通にできる
なんでしょうね
SetFocusだけがだめみたい
他のことは普通にできる
なんでしょうね
867デフォルトの名無しさん (バットンキン MM7a-Yq9l)
2018/01/12(金) 23:46:18.93ID:WKndAwKhM いやExsel 2007もサポート切れてますが
868デフォルトの名無しさん (ワッチョイ eab3-0PCX)
2018/01/13(土) 03:26:50.74ID:0Hr8k8ED0869デフォルトの名無しさん (ワッチョイ 6a1e-53ns)
2018/01/13(土) 09:26:06.50ID:60QkmGs40 試してないけど、プロパティのTabIndexも駄目だったの?
870デフォルトの名無しさん (ワッチョイ 118a-zETe)
2018/01/13(土) 10:05:22.76ID:8yN0Kzpj0 ThisWorkbook.Application.Hwndでブックのハンドルを取得して、
SetLayeredWindowAttributesで透過処理をする時、
LWA_ALPHAでは問題ないのに、
LWA_COLORKEYに変えると、なぜかブック全体ではなく、
シート上に最初に配置したコマンドボタンの方に誤爆します。
しかも、自分のPCでは問題ないのに、他人のPCだと誤爆するという意味不明さ。
ハンドルがずれる的なバグでもあるのでしょうか?
SetLayeredWindowAttributesで透過処理をする時、
LWA_ALPHAでは問題ないのに、
LWA_COLORKEYに変えると、なぜかブック全体ではなく、
シート上に最初に配置したコマンドボタンの方に誤爆します。
しかも、自分のPCでは問題ないのに、他人のPCだと誤爆するという意味不明さ。
ハンドルがずれる的なバグでもあるのでしょうか?
871デフォルトの名無しさん
2018/01/13(土) 10:12:39.30 ウィンドウ表示時にフォーカス当てたいんならTabIndex=0にすればいいんだと思うけど、
あとはフラグを使ってInitialize直後のActivateイベントでフォーカスを当てればいいんじゃね?
Private mblnInitFlag As Boolean
Private Sub UserForm_Activate()
If mblnInitFlag Then
TextBox2.SetFocus
mblnInitFlag = False
End If
End Sub
Private Sub UserForm_Initialize()
mblnInitFlag = True
End Sub
あとはフラグを使ってInitialize直後のActivateイベントでフォーカスを当てればいいんじゃね?
Private mblnInitFlag As Boolean
Private Sub UserForm_Activate()
If mblnInitFlag Then
TextBox2.SetFocus
mblnInitFlag = False
End If
End Sub
Private Sub UserForm_Initialize()
mblnInitFlag = True
End Sub
872デフォルトの名無しさん (ワッチョイ b5b3-DdNP)
2018/01/13(土) 10:19:25.53ID:WLDq+ue70 一つ目の表
A,B,C,D,E
aaa,bb,cc,00,20
bbb,cc,dd,11,30
二つ目の表
G,H,I,J,K
aaa,bb,cc,00,10
bbb,cc,dd,11,10
上の様な表があり、一つ目のABC列と二つ目のGHI列の値が一致すれば、二つ目の表の横にE列からK列の数値を引いた値を表示したい。
一致するデータが無ければ、一致データ無しと表示。
上の表だと2つ目の表の右列に、それぞれ10,20と表示。
データ量は300~800程です。
出来る方、よろしくお願いします。
A,B,C,D,E
aaa,bb,cc,00,20
bbb,cc,dd,11,30
二つ目の表
G,H,I,J,K
aaa,bb,cc,00,10
bbb,cc,dd,11,10
上の様な表があり、一つ目のABC列と二つ目のGHI列の値が一致すれば、二つ目の表の横にE列からK列の数値を引いた値を表示したい。
一致するデータが無ければ、一致データ無しと表示。
上の表だと2つ目の表の右列に、それぞれ10,20と表示。
データ量は300~800程です。
出来る方、よろしくお願いします。
873デフォルトの名無しさん
2018/01/13(土) 10:29:13.82874デフォルトの名無しさん (スッップ Sd0a-YX4c)
2018/01/13(土) 10:31:29.99ID:uYJANG/vd 既存プログラムで引数が多いやつを減らしたいんだけどどうすればいい?
ただグローバル変数使うと他のアプリケーションに影響出るから使えない。
今から構造化やクラスにするのは名前変更が大変そうだし、同じ型でも同じ動作でもないからまとめにくい。
ただグローバル変数使うと他のアプリケーションに影響出るから使えない。
今から構造化やクラスにするのは名前変更が大変そうだし、同じ型でも同じ動作でもないからまとめにくい。
875デフォルトの名無しさん (ワッチョイ 118a-zETe)
2018/01/13(土) 10:39:42.82ID:8yN0Kzpj0 >>873
それが、コマンドボタンとシートの色を同じにしても、
コマンドボタンの方だけ透過されるんです。
しかも最初に配置したコマンドボタンだけ。
2個目以降は変わらず。
透過の前後で、ハンドルの値をデバッグプリントしても変化ないですし。
それが、コマンドボタンとシートの色を同じにしても、
コマンドボタンの方だけ透過されるんです。
しかも最初に配置したコマンドボタンだけ。
2個目以降は変わらず。
透過の前後で、ハンドルの値をデバッグプリントしても変化ないですし。
876デフォルトの名無しさん
2018/01/13(土) 10:49:24.82 >>872
2007以降限定でよければL列に計算式埋め込んじゃうけどね
=IF(COUNTIFS($A:$A,$G1,$B:$B,$H1,$C:$C,$I1)>0,SUMIFS($E:$E,$A:$A,$G1,$B:$B,$H1,$C:$C,$I1)-$K1,"一致データ無し")
2007以降限定でよければL列に計算式埋め込んじゃうけどね
=IF(COUNTIFS($A:$A,$G1,$B:$B,$H1,$C:$C,$I1)>0,SUMIFS($E:$E,$A:$A,$G1,$B:$B,$H1,$C:$C,$I1)-$K1,"一致データ無し")
877デフォルトの名無しさん (ワッチョイ 118a-zETe)
2018/01/13(土) 11:20:55.87ID:8yN0Kzpj0 ちなみに、こんなのです。
Sub test(ByVal Flg As Boolean)
Dim Hwnd As Long: Hwnd = ThisWorkbook.Application.Hwnd
Call SetWindowLong(Hwnd, -20, &H80000)
If Flg Then
Call SetLayeredWindowAttributes(Hwnd, 0, 200, 1) '←成功
Else
Call SetLayeredWindowAttributes(Hwnd, 0, 200, 2) '←コマンドボタンに誤爆
End If
End Sub
変えているのは最後の引数だけなんですが。
Sub test(ByVal Flg As Boolean)
Dim Hwnd As Long: Hwnd = ThisWorkbook.Application.Hwnd
Call SetWindowLong(Hwnd, -20, &H80000)
If Flg Then
Call SetLayeredWindowAttributes(Hwnd, 0, 200, 1) '←成功
Else
Call SetLayeredWindowAttributes(Hwnd, 0, 200, 2) '←コマンドボタンに誤爆
End If
End Sub
変えているのは最後の引数だけなんですが。
878デフォルトの名無しさん
2018/01/13(土) 11:27:43.02 >>874
Sub test1()
Dim args(5) As Variant
Dim arg1 As String
Dim arg2 As Long
Dim arg3 As Variant
Dim arg4 As Workbook
Dim arg5 As Collection
arg1 = "test"
arg2 = 123
arg3 = ActiveSheet.Cells(1, 1)
Set arg4 = ActiveWorkbook
Set arg5 = New Collection
arg5.Add New DataObject
arg5.Item(1).SetText "sample"
args(1) = arg1
args(2) = arg2
args(3) = arg3
Set args(4) = arg4
Set args(5) = arg5
Call test2(args)
End Sub
‘ ――
Sub test2(ByRef args As Variant)
Dim arg1 As String
Dim arg2 As Long
Dim arg3 As Variant
Dim arg4 As Workbook
Dim arg5 As Collection
arg1 = args(1)
arg2 = args(2)
arg3 = args(3)
Set arg4 = args(4)
Set arg5 = args(5)
Debug.Print arg1
Debug.Print arg2
Debug.Print arg3
Debug.Print arg4.Name
Debug.Print arg5.Item(1).GetText
End Sub
Sub test1()
Dim args(5) As Variant
Dim arg1 As String
Dim arg2 As Long
Dim arg3 As Variant
Dim arg4 As Workbook
Dim arg5 As Collection
arg1 = "test"
arg2 = 123
arg3 = ActiveSheet.Cells(1, 1)
Set arg4 = ActiveWorkbook
Set arg5 = New Collection
arg5.Add New DataObject
arg5.Item(1).SetText "sample"
args(1) = arg1
args(2) = arg2
args(3) = arg3
Set args(4) = arg4
Set args(5) = arg5
Call test2(args)
End Sub
‘ ――
Sub test2(ByRef args As Variant)
Dim arg1 As String
Dim arg2 As Long
Dim arg3 As Variant
Dim arg4 As Workbook
Dim arg5 As Collection
arg1 = args(1)
arg2 = args(2)
arg3 = args(3)
Set arg4 = args(4)
Set arg5 = args(5)
Debug.Print arg1
Debug.Print arg2
Debug.Print arg3
Debug.Print arg4.Name
Debug.Print arg5.Item(1).GetText
End Sub
879デフォルトの名無しさん (ワッチョイ b5b3-DdNP)
2018/01/13(土) 13:04:46.60ID:WLDq+ue70 >>876
列の挿入や削除の処理があるので、数式だと参照ズレなどが起こってしまうので出来たらVBAで処理したいと考えています。
列の挿入や削除の処理があるので、数式だと参照ズレなどが起こってしまうので出来たらVBAで処理したいと考えています。
880858 (ワッチョイ 1188-/4a5)
2018/01/13(土) 13:29:13.07ID:eGapce6A0882デフォルトの名無しさん (ワッチョイ 5e9f-QpsD)
2018/01/13(土) 13:47:55.56ID:fyAvIt7m0 並べて比較って
人間が何かを見比べて確認しているわけだから
その作業は人間がやる必要ないとおもうので
全部VBAでバックグランドで処理すればいいのではないかと単純に思ってしまう
最後に比較した結果だけ表示してあげる
人間が何かを見比べて確認しているわけだから
その作業は人間がやる必要ないとおもうので
全部VBAでバックグランドで処理すればいいのではないかと単純に思ってしまう
最後に比較した結果だけ表示してあげる
883デフォルトの名無しさん (ワッチョイ 1188-/4a5)
2018/01/13(土) 15:21:57.51ID:eGapce6A0884デフォルトの名無しさん
2018/01/13(土) 16:53:07.70 >>883
> 比較する対象を特定する事は計算式でできない
意味分からん
=IF(COUNTIFS($A:$A,$G1,$B:$B,$H1,$C:$C,$I1)>0,SUMIFS($E:$E,$A:$A,$G1,$B:$B,$H1,$C:$C,$I1)-$K1,"一致データ無し")
この計算式を単純にVBAに置き換えて
With Worksheets("Sheet1")
If WorksheetFunction.CountIfs(.Range(“A:A”), .Range(“G1”), .Range(“B:B”), .Range(“H1”), .Range(“C:C”), .Range(“I1”)) Then
.Range(“L1”) = WorksheetFunction.SumIfs(.Range(“E:E”), .Range(“A:A”), .Range(“G1”), .Range(“B:B”), .Range(“H1”), .Range(“C:C”), .Range(“I1”)) - .Range(“K1”)
Else
.Range(“L1”) = “一致データ無し”
EndIf
End With
行列を変数で指定できるように.Rangeを.Columnsや.Cellsに置き換えて数値で指定できるようにして
With Worksheets("Sheet1")
If WorksheetFunction.CountIfs(.Columns(1), .Cells(1,7), .Columns(2), .Cells(1,8), .Columns(3), .Cells(1,9)) Then
.Cells(1,12) = WorksheetFunction.SumIfs(.Columns(5), .Columns(1), .Cells(1,7), .Columns(2), .Cells(1,8), .Columns(3), .Cells(1,9)) - .Cells(1,11)
Else
.Cells(1,12) = “一致データ無し”
EndIf
End With
あとは必要なところを変数化してループを回せばいいじゃん
Dim rngCell As Range
Dim lngRow As Long ‘ ループを回すため行番号を変数化
With Worksheets("Sheet1")
Set rngCell = .Cells(1, 12)
‘ 表の詳細仕様が分からないのでとりあえずK列が空じゃない限りループ続行
While rngCell.Offset(0, -1) <> “”
lngRow = rngCell.Row
If WorksheetFunction.CountIfs(.Columns(1), .Cells(lngRow,7), .Columns(2), .Cells(lngRow,8), .Columns(3), .Cells(lngRow,9)) Then
rngCell = WorksheetFunction.SumIfs(.Columns(5), .Columns(1), .Cells(lngRow,7), .Columns(2), .Cells(lngRow,8), .Columns(3), .Cells(lngRow,9)) - .Cells(lngRow,11)
Else
rngCell = “一致データ無し”
EndIf
Set rngCell = rngCell.Offset(1, 0) ‘ 次の行
Wend
End With
列の追加削除があるということだったら列番号も変数化すればいい
> 比較する対象を特定する事は計算式でできない
意味分からん
=IF(COUNTIFS($A:$A,$G1,$B:$B,$H1,$C:$C,$I1)>0,SUMIFS($E:$E,$A:$A,$G1,$B:$B,$H1,$C:$C,$I1)-$K1,"一致データ無し")
この計算式を単純にVBAに置き換えて
With Worksheets("Sheet1")
If WorksheetFunction.CountIfs(.Range(“A:A”), .Range(“G1”), .Range(“B:B”), .Range(“H1”), .Range(“C:C”), .Range(“I1”)) Then
.Range(“L1”) = WorksheetFunction.SumIfs(.Range(“E:E”), .Range(“A:A”), .Range(“G1”), .Range(“B:B”), .Range(“H1”), .Range(“C:C”), .Range(“I1”)) - .Range(“K1”)
Else
.Range(“L1”) = “一致データ無し”
EndIf
End With
行列を変数で指定できるように.Rangeを.Columnsや.Cellsに置き換えて数値で指定できるようにして
With Worksheets("Sheet1")
If WorksheetFunction.CountIfs(.Columns(1), .Cells(1,7), .Columns(2), .Cells(1,8), .Columns(3), .Cells(1,9)) Then
.Cells(1,12) = WorksheetFunction.SumIfs(.Columns(5), .Columns(1), .Cells(1,7), .Columns(2), .Cells(1,8), .Columns(3), .Cells(1,9)) - .Cells(1,11)
Else
.Cells(1,12) = “一致データ無し”
EndIf
End With
あとは必要なところを変数化してループを回せばいいじゃん
Dim rngCell As Range
Dim lngRow As Long ‘ ループを回すため行番号を変数化
With Worksheets("Sheet1")
Set rngCell = .Cells(1, 12)
‘ 表の詳細仕様が分からないのでとりあえずK列が空じゃない限りループ続行
While rngCell.Offset(0, -1) <> “”
lngRow = rngCell.Row
If WorksheetFunction.CountIfs(.Columns(1), .Cells(lngRow,7), .Columns(2), .Cells(lngRow,8), .Columns(3), .Cells(lngRow,9)) Then
rngCell = WorksheetFunction.SumIfs(.Columns(5), .Columns(1), .Cells(lngRow,7), .Columns(2), .Cells(lngRow,8), .Columns(3), .Cells(lngRow,9)) - .Cells(lngRow,11)
Else
rngCell = “一致データ無し”
EndIf
Set rngCell = rngCell.Offset(1, 0) ‘ 次の行
Wend
End With
列の追加削除があるということだったら列番号も変数化すればいい
885デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
2018/01/13(土) 17:00:25.96ID:zzyV/8sb0 初心者で申し訳ありません
セルに入力した選手コードを選手名に置換するような動きをさせたいのですがどうするとよいでしょうか
別のシートに選手名簿は用意してありA列に選手コードB列に選手名があります
セルに入力した選手コードを選手名に置換するような動きをさせたいのですがどうするとよいでしょうか
別のシートに選手名簿は用意してありA列に選手コードB列に選手名があります
886デフォルトの名無しさん (ワッチョイ eab3-J7fK)
2018/01/13(土) 17:42:32.57ID:8qhapkmN0887デフォルトの名無しさん (ワッチョイ eab3-J7fK)
2018/01/13(土) 17:48:09.64ID:8qhapkmN0 すまん「置換」を見落とした
VBAは要るな
WorksheetFunction.VLookup でやるなり、ループで検索するなりやればいい
VBAは要るな
WorksheetFunction.VLookup でやるなり、ループで検索するなりやればいい
888デフォルトの名無しさん (アークセー Sxbd-IRwv)
2018/01/13(土) 17:50:29.11ID:gLbKwyK9x889デフォルトの名無しさん
2018/01/13(土) 17:58:56.84890デフォルトの名無しさん (アークセー Sxbd-IRwv)
2018/01/13(土) 18:00:41.47ID:gLbKwyK9x >>887
検索置換のダイアログでシート内の選手コードを一括変換する、みたいな手作業の業務手順をそのままマクロ化しようとしているのかもしれないし、そういう場合はそもそもシートの設計や業務手順に問題がある場合が多い。
最初にVLOOKUP使えと指摘したあんたの感覚は基本的には正しいと思うぞ。
検索置換のダイアログでシート内の選手コードを一括変換する、みたいな手作業の業務手順をそのままマクロ化しようとしているのかもしれないし、そういう場合はそもそもシートの設計や業務手順に問題がある場合が多い。
最初にVLOOKUP使えと指摘したあんたの感覚は基本的には正しいと思うぞ。
891デフォルトの名無しさん (ワッチョイ 5e9f-QpsD)
2018/01/13(土) 18:06:27.84ID:fyAvIt7m0 >>885
単発ならワークシート関数でやった方が簡単
VLOOKUPで変換したのを用意しといてそれをごそっと上書きする
何回もやるなら、上記をマクロにする
このくらいならマクロの記録でもいけそう
全部VBA上でやる方法もあるけどビギナーには大変でしょう
こんな感じでいいんじゃなかろうか
Dim i
i = スタートする行
Do While Not Worksheets(1).Cells(i, 1) = ""
Worksheets(1).Cells(i, 1) = WorksheetFunction.VLookup _
(Worksheets(1).Cells(i, 1), Worksheets(2).Range("名簿範囲"), 2, 0)
i = i + 1
Loop
シートのインデックスとかは書き換えてね
意味不明ならマクロ記録かさらなる修行をオススメする
単発ならワークシート関数でやった方が簡単
VLOOKUPで変換したのを用意しといてそれをごそっと上書きする
何回もやるなら、上記をマクロにする
このくらいならマクロの記録でもいけそう
全部VBA上でやる方法もあるけどビギナーには大変でしょう
こんな感じでいいんじゃなかろうか
Dim i
i = スタートする行
Do While Not Worksheets(1).Cells(i, 1) = ""
Worksheets(1).Cells(i, 1) = WorksheetFunction.VLookup _
(Worksheets(1).Cells(i, 1), Worksheets(2).Range("名簿範囲"), 2, 0)
i = i + 1
Loop
シートのインデックスとかは書き換えてね
意味不明ならマクロ記録かさらなる修行をオススメする
892デフォルトの名無しさん (アークセー Sxbd-IRwv)
2018/01/13(土) 18:07:34.63ID:gLbKwyK9x >>889
VBAに慣れてる人ならセル値の置換と聞いただけでワークシート更新イベントを使いたいのかなって思いがちだよな
俺も最初はそう思ったわ
でも質問者の質問内容を推測抜きで素直に読むとそうとは限らないんだよな
VBAに慣れてる人ならセル値の置換と聞いただけでワークシート更新イベントを使いたいのかなって思いがちだよな
俺も最初はそう思ったわ
でも質問者の質問内容を推測抜きで素直に読むとそうとは限らないんだよな
893デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
2018/01/13(土) 18:19:24.76ID:zzyV/8sb0894デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
2018/01/13(土) 18:35:21.45ID:zzyV/8sb0895858 (ワッチョイ 1188-/4a5)
2018/01/13(土) 18:44:45.15ID:eGapce6A0896デフォルトの名無しさん (アウアウカー Sa55-sebt)
2018/01/13(土) 19:03:27.44ID:rZTV+Qsta >>895
ファイル名とかシート名がランダムでないなら
固定値じゃないの?
どんなファイル名か分からない、シート名か分からないってなら都度入力するしかないな。
データ形式で特定することもできるけど、
無駄な作業にしか思えない。
ファイル名とかシート名がランダムでないなら
固定値じゃないの?
どんなファイル名か分からない、シート名か分からないってなら都度入力するしかないな。
データ形式で特定することもできるけど、
無駄な作業にしか思えない。
897デフォルトの名無しさん (アークセー Sxbd-IRwv)
2018/01/13(土) 19:18:42.64ID:gLbKwyK9x >>893
こんな感じならどうかな
以下は、実行すると報告用シート内に含まれる選手コード全てを一気に置換する
複数の選手コードを含む場合も一発で置換できるはず
名簿にはコードの欄が空白の行がなく、名簿シートのA2セル以下に選手コードが入力されているものと仮定してる(A1は表見出し)
セル値の一部が選手コードと一致する場合も置換されてしまうので、コードのみが入力されているセルの値だけを確実に置換したい場合、Replaceメソッドの引数のLookAt:=xlPart をLookAt:=xlWholeに変更してくれ
Sub ReplaceCode
Dim sh_list As WorkSheet '選手名簿シート
Dim sh_report As WorkSheet '報告用シート
Dim i As Long
Set sh_list = WorkSheets("選手名簿シート")
Set sh_report = WorkSheets("報告用シート")
For i = 2 To sh_list.Range("A2").End("xlDown").Row
sh_report.Cells.Replace What:=sh_list.Cells(i, 1).Value, Replacement:=sh_list.Cells(i, 2).Value, LookAt:=xlPart
Next i
End Sub
こんな感じならどうかな
以下は、実行すると報告用シート内に含まれる選手コード全てを一気に置換する
複数の選手コードを含む場合も一発で置換できるはず
名簿にはコードの欄が空白の行がなく、名簿シートのA2セル以下に選手コードが入力されているものと仮定してる(A1は表見出し)
セル値の一部が選手コードと一致する場合も置換されてしまうので、コードのみが入力されているセルの値だけを確実に置換したい場合、Replaceメソッドの引数のLookAt:=xlPart をLookAt:=xlWholeに変更してくれ
Sub ReplaceCode
Dim sh_list As WorkSheet '選手名簿シート
Dim sh_report As WorkSheet '報告用シート
Dim i As Long
Set sh_list = WorkSheets("選手名簿シート")
Set sh_report = WorkSheets("報告用シート")
For i = 2 To sh_list.Range("A2").End("xlDown").Row
sh_report.Cells.Replace What:=sh_list.Cells(i, 1).Value, Replacement:=sh_list.Cells(i, 2).Value, LookAt:=xlPart
Next i
End Sub
898858 (ワッチョイ 1188-/4a5)
2018/01/13(土) 19:32:04.47ID:eGapce6A0 >>896
ファイルのフォーマットが複数あるので、
事前にファイル名とシート名を規定できないのです。
なので、せめてペアにしたファイル同士が特定できれば、
ファイルとシートを選択する手間が省けると思ったのですが・・・
3つ以上開けなくなるけど、workbooksからマクロブックを除外した先頭2つを比較する方法で考えてみます。
ファイルのフォーマットが複数あるので、
事前にファイル名とシート名を規定できないのです。
なので、せめてペアにしたファイル同士が特定できれば、
ファイルとシートを選択する手間が省けると思ったのですが・・・
3つ以上開けなくなるけど、workbooksからマクロブックを除外した先頭2つを比較する方法で考えてみます。
899デフォルトの名無しさん (ワッチョイ 66fa-53ns)
2018/01/13(土) 19:36:48.93ID:6HVsHBKb0900デフォルトの名無しさん (ワッチョイ b5b3-6BZu)
2018/01/13(土) 23:03:28.12ID:aJN0Dby50 エクセル2010でCSVファイルを開いた場合、
UTF8やshiftjisを自動で判定して表示してくれますが、
この時に判定された文字コードを取得する方法はありますか。
用途は、外部データの取り込みでCSVを開きなおすための文字コードの特定です。
UTF8やshiftjisを自動で判定して表示してくれますが、
この時に判定された文字コードを取得する方法はありますか。
用途は、外部データの取り込みでCSVを開きなおすための文字コードの特定です。
901デフォルトの名無しさん (ワッチョイ 8903-YNmt)
2018/01/13(土) 23:14:29.83ID:odSwvUdp0 >>900
application.nkf
application.nkf
902デフォルトの名無しさん (ワッチョイ b5b3-6BZu)
2018/01/13(土) 23:28:32.80ID:aJN0Dby50903デフォルトの名無しさん (ワッチョイ e52b-Yq9l)
2018/01/14(日) 06:58:25.18ID:UVUQYwWb0 >>902
いいってことよ(´・ω・`)b
いいってことよ(´・ω・`)b
904デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
2018/01/15(月) 01:08:16.65ID:Zqan8uZj0 >>897
実行時エラー13
型が一致しませんとなっていて
For~の行でエラーを出していて止まるみたいです
あと報告シートが選手の強さ別に複数に分かれているのですが今選手コードの入力したシート(つまりいま開いているマクロ実行用のボタンを押したシート)を処理したいという場合どうするとよいのか教えていただけると助かります
実行時エラー13
型が一致しませんとなっていて
For~の行でエラーを出していて止まるみたいです
あと報告シートが選手の強さ別に複数に分かれているのですが今選手コードの入力したシート(つまりいま開いているマクロ実行用のボタンを押したシート)を処理したいという場合どうするとよいのか教えていただけると助かります
905897 (アークセー Sxbd-IRwv)
2018/01/15(月) 01:48:08.96ID:ubg4QImpx >>904
エラーの出たコードを転載して見せてもらえませんか?こちらの環境ではうまく動いているんですが、私がコードを転載したときにミスをしたかもしれないので
それから、コードはボタンマクロ(ボタン名_Clickのような名前のプロシージャ)として各シートのシートモジュールに書いているんでしょうか?
エラーの出たコードを転載して見せてもらえませんか?こちらの環境ではうまく動いているんですが、私がコードを転載したときにミスをしたかもしれないので
それから、コードはボタンマクロ(ボタン名_Clickのような名前のプロシージャ)として各シートのシートモジュールに書いているんでしょうか?
906デフォルトの名無しさん (ワッチョイ f1f7-lXUw)
2018/01/15(月) 11:28:57.27ID:thpu0oBS0 >>905
Sub ReplaceCode()
Dim sh_list As Worksheet '選手名簿シート
Dim sh_report As Worksheet '報告用シート
Dim i As Long
Set sh_list = Worksheets("選手名簿")
Set sh_report = Worksheets("対戦結果表_A級")
For i = 2 To sh_list.Range("A2").End("xlDown").Row
sh_report.Cells.Replace What:=sh_list.Cells(i, 1).Value, Replacement:=sh_list.Cells(i, 2).Value, LookAt:=xlPart
Next i
End Sub
シート作成用のコードが既にあるのですがその中のコードを流用して各シートに実行用のボタンを置く計画でした
ActiveSheet.Buttons.Add(2, 1.5, 125, 18.75).Select
Selection.OnAction = "CSV_SAVE"
Selection.Characters.Text = Worksheets(2).Cells(1, 1).Text & "級のCSVファイル作成"
With Selection.Characters(Start:=1, Length:=15).Font
.Name = "MS Pゴシック"
.FontStyle = "標準"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
End With
これのCSV_SAVEをReplaceCodeにしてボタンの名前と場所をかえるつもりでしたがあまりよくない方法なのでしょうか
必要であれば既にあるコードを出しますので教えてください
Sub ReplaceCode()
Dim sh_list As Worksheet '選手名簿シート
Dim sh_report As Worksheet '報告用シート
Dim i As Long
Set sh_list = Worksheets("選手名簿")
Set sh_report = Worksheets("対戦結果表_A級")
For i = 2 To sh_list.Range("A2").End("xlDown").Row
sh_report.Cells.Replace What:=sh_list.Cells(i, 1).Value, Replacement:=sh_list.Cells(i, 2).Value, LookAt:=xlPart
Next i
End Sub
シート作成用のコードが既にあるのですがその中のコードを流用して各シートに実行用のボタンを置く計画でした
ActiveSheet.Buttons.Add(2, 1.5, 125, 18.75).Select
Selection.OnAction = "CSV_SAVE"
Selection.Characters.Text = Worksheets(2).Cells(1, 1).Text & "級のCSVファイル作成"
With Selection.Characters(Start:=1, Length:=15).Font
.Name = "MS Pゴシック"
.FontStyle = "標準"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
End With
これのCSV_SAVEをReplaceCodeにしてボタンの名前と場所をかえるつもりでしたがあまりよくない方法なのでしょうか
必要であれば既にあるコードを出しますので教えてください
907デフォルトの名無しさん (ワッチョイ 1188-/4a5)
2018/01/15(月) 11:58:16.00ID:Vljo7f2q0 >>903
application.nkf オブジェクトが見つかりませんでした。
下記のapplicationオブジェクト内にも、nkfプロパティが見つかりません。
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-object-excel
オブジェクトの参照方法が違うのでしょうか。
application.nkf オブジェクトが見つかりませんでした。
下記のapplicationオブジェクト内にも、nkfプロパティが見つかりません。
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-object-excel
オブジェクトの参照方法が違うのでしょうか。
908897 (アークセー Sxbd-IRwv)
2018/01/15(月) 23:02:33.00ID:JvjYqsKWx909デフォルトの名無しさん (スッップ Sd0a-YX4c)
2018/01/16(火) 12:17:16.43ID:SelV7zwId 質問です。
ソルバーで普通は目的セルをrangeなどで指定しますが、シートのセルにアクセスせず、vba内の変数を直接ソルバーにかけてvba内だけで完結したいのですが、方法あるでしょうか?
ソルバーで普通は目的セルをrangeなどで指定しますが、シートのセルにアクセスせず、vba内の変数を直接ソルバーにかけてvba内だけで完結したいのですが、方法あるでしょうか?
910デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
2018/01/17(水) 02:18:24.01ID:x8yvrTsd0911デフォルトの名無しさん (ワッチョイ 239b-Q7o0)
2018/01/20(土) 12:24:27.92ID:sSjH/Vu40 セルのA列にある文字列をコンボboxにaddですべて入れた後に、一文字入力する度に候補が絞られてくって出来ます?
コード教えてもらえないですか?
コード教えてもらえないですか?
912デフォルトの名無しさん (オッペケ Srb1-WK0C)
2018/01/20(土) 12:31:05.83ID:TVDu7Qf0r 一文字入力する度にコンボボックスの候補を絞ればいいんとちゃうか?
知らんけど
知らんけど
913デフォルトの名無しさん (ワッチョイ c51a-3Ttg)
2018/01/20(土) 13:28:17.12ID:uuergXrf0 社内に部品表があって、重複している名前を省いて部品種類一覧の表を作ろうと思ってます。
・ネジM5
・ネジM5
・ナットM5
・ナットM5
↓
・ネジM5
・ナットM5
というイメージです。
自分なりに下記のマクロを組んでみました。
Dim row As Long, col As Long, D As Range
col = 1
row = 1
Do Until Cells(row, col) = ""
If Not Cells(row, col) = Cells(row + 1, col) Then
If D Is Nothing Then
Set D = Cells(row, col)
Else
Set D = Union(D, Cells(row, col))
End If
End If
row = row + 1
Loop
この後レンジDをコピペするマクロです。
部品の種類が100とか200なら動いてくれますが、本来20,000件超の部品の種類があり、こちらを処理するとフリーズします。
デバックのウィンドウはユニオンのところを指定してきてるんですが、ユニオンにはまとめられる量の限界などがあるのでしょうか?
・ネジM5
・ネジM5
・ナットM5
・ナットM5
↓
・ネジM5
・ナットM5
というイメージです。
自分なりに下記のマクロを組んでみました。
Dim row As Long, col As Long, D As Range
col = 1
row = 1
Do Until Cells(row, col) = ""
If Not Cells(row, col) = Cells(row + 1, col) Then
If D Is Nothing Then
Set D = Cells(row, col)
Else
Set D = Union(D, Cells(row, col))
End If
End If
row = row + 1
Loop
この後レンジDをコピペするマクロです。
部品の種類が100とか200なら動いてくれますが、本来20,000件超の部品の種類があり、こちらを処理するとフリーズします。
デバックのウィンドウはユニオンのところを指定してきてるんですが、ユニオンにはまとめられる量の限界などがあるのでしょうか?
914デフォルトの名無しさん (ワッチョイ 0bfa-weOF)
2018/01/20(土) 13:33:34.73ID:wJgnfOTG0 >>913
Accessでやれ。
Accessでやれ。
915デフォルトの名無しさん (ワッチョイ 23b3-3fO/)
2018/01/20(土) 13:41:46.63ID:CFAgCrzx0 >>913
ソートして重複を削除じゃダメなのか?
ソートして重複を削除じゃダメなのか?
916デフォルトの名無しさん (ワッチョイ ddc3-9sdm)
2018/01/20(土) 15:03:19.74ID:Fb/tMd6M0 >>913
Excel VBAでやってもいいけど、RANGEオブジェクトに溜め込むやり方よりは、素直に別シートに値をコピー、さらにそれを検索して別の値が出てきたら別シートにコピーでいいんじゃないのか?
そもそもExcelのフィルタ関連の機能でもできるからVBAを使う理由がわからない。
Excel VBAでやってもいいけど、RANGEオブジェクトに溜め込むやり方よりは、素直に別シートに値をコピー、さらにそれを検索して別の値が出てきたら別シートにコピーでいいんじゃないのか?
そもそもExcelのフィルタ関連の機能でもできるからVBAを使う理由がわからない。
917デフォルトの名無しさん (ササクッテロロ Spb1-TYcc)
2018/01/20(土) 15:06:48.01ID:iefRLv2cp >>913
dictionaryとかでだめかな?
dictionaryとかでだめかな?
918デフォルトの名無しさん (ワッチョイ db7f-Ye64)
2018/01/20(土) 17:40:00.19ID:91x3kJT10 DBMSがコンソールなんかに返した結果を
Excelセルに上手く貼り付ける方法ってある?
Excelセルに上手く貼り付ける方法ってある?
919デフォルトの名無しさん (ワッチョイ 0bfa-weOF)
2018/01/20(土) 19:41:33.47ID:wJgnfOTG0 >>918
詳細忘れたけど代入する事で、そのまま貼り付けられるメソッドがあったはず。
詳細忘れたけど代入する事で、そのまま貼り付けられるメソッドがあったはず。
920デフォルトの名無しさん (ワッチョイ 1d03-Qz07)
2018/01/20(土) 20:44:55.78ID:Y9eKqT4m0 多くは語らんけどある意味エスパーと言っておこうw
921デフォルトの名無しさん (ワッチョイ db9f-GP+B)
2018/01/21(日) 13:18:30.88ID:+2jqUeqC0 >>913
ADOなら一瞬で終わる
いろいろ突っ込まれているように、別の方法のが簡単だと思うけど
シート名やら列名は読みかえてね
Dim adocon As Object, adors As Object
Set adocon = CreateObject("ADODB.Connection")
Set adors = CreateObject("ADODB.Recordset")
With adocon
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Extended Properties") = "Excel 12.0"
.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name
End With
Set adors = adocon.Execute("SELECT DISTINCT 部品名 FROM [部品表$]")
Worksheets("部品種類一覧").Range("a1").CopyFromRecordset adors
adocon.Close
ADOなら一瞬で終わる
いろいろ突っ込まれているように、別の方法のが簡単だと思うけど
シート名やら列名は読みかえてね
Dim adocon As Object, adors As Object
Set adocon = CreateObject("ADODB.Connection")
Set adors = CreateObject("ADODB.Recordset")
With adocon
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Extended Properties") = "Excel 12.0"
.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name
End With
Set adors = adocon.Execute("SELECT DISTINCT 部品名 FROM [部品表$]")
Worksheets("部品種類一覧").Range("a1").CopyFromRecordset adors
adocon.Close
922デフォルトの名無しさん (ワッチョイ 239b-Q7o0)
2018/01/21(日) 15:03:53.81ID:pRI5Eg/X0 >>857
だれかこれわかる人いません?
だれかこれわかる人いません?
923デフォルトの名無しさん (ドコグロ MM99-vVh4)
2018/01/21(日) 16:45:39.61ID:WhYlNzfJM924デフォルトの名無しさん (アウアウイー Sa31-Y7DI)
2018/01/21(日) 18:35:28.14ID:7nwc0luUa 重複なしリストはいろいろやり方あるけど、標準機能使うかadoでやるかがスマートだろうね
dictionaryもありだけど、fsoのやつはなんか取り回しがいまいちじゃね
dictionaryもありだけど、fsoのやつはなんか取り回しがいまいちじゃね
925デフォルトの名無しさん (ワッチョイ 1d03-Qz07)
2018/01/21(日) 18:40:31.69ID:nVuQLEta0 ここ初心者スレかと思ってスレタイ見なおしてしまったわw
オレ以外初心者しかおらんやんw
オレ以外初心者しかおらんやんw
926デフォルトの名無しさん (ワッチョイ 0bfa-weOF)
2018/01/21(日) 18:41:57.84ID:EcNkRoqM0 メゾット君また寂しくなって来ちゃったのか
927デフォルトの名無しさん (アウアウイー Sa31-Y7DI)
2018/01/21(日) 18:57:02.81ID:7nwc0luUa .netframeworkのlistって重複削除機能なかったっけ?
928デフォルトの名無しさん (ワッチョイ db9f-GP+B)
2018/01/21(日) 20:07:47.89ID:+2jqUeqC0 >>927
リストにあるかないかはわかるみたい
これなら配列に突っ込んで総当たりしていくのと変わらなそう
読みやすくはなるけど
Dim partsList As Object
Set partsList = CreateObject("System.Collections.ArrayList")
Dim partsData
Set partsData = Range("データの列")
Dim parts
For Each parts In partsData
If Not partsList.Contains(parts.Value) Then
partsList.Add parts.Value
End If
Next
出力処理省略
リストにあるかないかはわかるみたい
これなら配列に突っ込んで総当たりしていくのと変わらなそう
読みやすくはなるけど
Dim partsList As Object
Set partsList = CreateObject("System.Collections.ArrayList")
Dim partsData
Set partsData = Range("データの列")
Dim parts
For Each parts In partsData
If Not partsList.Contains(parts.Value) Then
partsList.Add parts.Value
End If
Next
出力処理省略
929デフォルトの名無しさん (ワッチョイ 23b3-3fO/)
2018/01/21(日) 20:16:12.20ID:rQmHQ7OM0930デフォルトの名無しさん (ワッチョイ 8df7-f5OR)
2018/01/21(日) 21:00:25.33ID:xouI7cQH0931デフォルトの名無しさん (ワッチョイ 1d03-Qz07)
2018/01/21(日) 21:12:55.02ID:nVuQLEta0932デフォルトの名無しさん (ワッチョイ 0b80-H9dj)
2018/01/21(日) 21:38:18.50ID:Ycn/1JW20 require 'set'
File.readlines("ファイル名").to_set.map { |item| puts item }
Ruby の集合を使うと、以下のような行区切りのファイルを、
あ
い
あ
あ
う
い
以下のような結果にできる。
ただし、集合にはデフォルトで、順番は無いので、
順番が必要なら、お好みの基準でソートする
あ
い
う
File.readlines("ファイル名").to_set.map { |item| puts item }
Ruby の集合を使うと、以下のような行区切りのファイルを、
あ
い
あ
あ
う
い
以下のような結果にできる。
ただし、集合にはデフォルトで、順番は無いので、
順番が必要なら、お好みの基準でソートする
あ
い
う
933デフォルトの名無しさん (ワッチョイ 0bfa-weOF)
2018/01/21(日) 21:51:29.18ID:EcNkRoqM0 毎度思うんだが、Rubyって他言語のスレにまで布教しに来なきゃならないほど不人気なのか?
934デフォルトの名無しさん (ワッチョイ 0b80-H9dj)
2018/01/21(日) 22:19:18.53ID:Ycn/1JW20 Ruby だと、テキスト処理が、めちゃめちゃ簡単に作れる
他の言語のように、悪戦苦闘しない
他の言語のように、悪戦苦闘しない
935デフォルトの名無しさん (ワッチョイ db9f-GP+B)
2018/01/21(日) 22:23:07.58ID:+2jqUeqC0 どうせなら引っ越し準備も兼ねてPythonにしようゼ
936デフォルトの名無しさん (スプッッ Sd13-f5OR)
2018/01/21(日) 23:23:35.81ID:ppfN03med 単純に2万個のセルをUnionするだけで1時間かかる
Sub aaa()
Debug.Print Time
Dim u As Range
Set u = Cells(1, 1)
For r = 3 To 40000 Step 2
Set u = Union(u, Cells(r, 1))
Next
Debug.Print Time
End Sub
Sub aaa()
Debug.Print Time
Dim u As Range
Set u = Cells(1, 1)
For r = 3 To 40000 Step 2
Set u = Union(u, Cells(r, 1))
Next
Debug.Print Time
End Sub
937デフォルトの名無しさん (ワッチョイ 0b80-H9dj)
2018/01/21(日) 23:45:19.36ID:Ycn/1JW20938デフォルトの名無しさん (ワッチョイ 2323-16v+)
2018/01/22(月) 00:04:49.43ID:R+7srG110939デフォルトの名無しさん (ワッチョイ 0b80-H9dj)
2018/01/22(月) 01:20:01.78ID:pYe1Cwj70 そんなに時間が掛かるのなら、一旦データをエクスポートして、
データをテキスト処理してから、インポートして戻せば?
たかが、2万個のデータで、1時間は現実的ではない
そんなに時間が掛かっても、どうしても、VBA でやりたいのか?
データをテキスト処理してから、インポートして戻せば?
たかが、2万個のデータで、1時間は現実的ではない
そんなに時間が掛かっても、どうしても、VBA でやりたいのか?
940デフォルトの名無しさん (ワッチョイ 0bfa-weOF)
2018/01/22(月) 01:43:29.00ID:zmIcszTc0 あくまでUnionを使った場合であって高速に処理する方法はいくらでもあるからなぁ。
それに仕事でVBA使う環境だと他社との協調も考えなきゃいけないからRubyインストールする方がよっぽど非現実的だし。
まぁ、たぶんおちょくってるつもりなんだろうけど、そもそもVBA以外の環境がないって前提のスレだから、
Rubyマンの煽りが煽りになっていないっていう・・・。
それに仕事でVBA使う環境だと他社との協調も考えなきゃいけないからRubyインストールする方がよっぽど非現実的だし。
まぁ、たぶんおちょくってるつもりなんだろうけど、そもそもVBA以外の環境がないって前提のスレだから、
Rubyマンの煽りが煽りになっていないっていう・・・。
941デフォルトの名無しさん (ワッチョイ 8df7-f5OR)
2018/01/22(月) 04:08:31.22ID:Xp9Ai2fT0 重複の削除はワークシートでやった方がてっとり早いと思う
942デフォルトの名無しさん (ワッチョイ 3deb-Qbx4)
2018/01/22(月) 04:38:17.99ID:AE7SVx7N0 >>940
> そもそもVBA以外の環境がないって前提のスレだから
そんな前提で質問に来る人もいるだろうけど、
「最適解」を求めている人が、とりあえずVBAだとどうなるか、と思って質問する場合もあるでしょ
だから、質問者が「全体にVBA以外はダメ」って制限をかけていない限りは、
上でも、ACCESSを進めている人もいたけど、実用面から考えた回答も質問者の利益になると思うんだけど
(質問者がそう思っていても、何も知らないからそう思ってるってパターンすらあり得るかな)
> そもそもVBA以外の環境がないって前提のスレだから
そんな前提で質問に来る人もいるだろうけど、
「最適解」を求めている人が、とりあえずVBAだとどうなるか、と思って質問する場合もあるでしょ
だから、質問者が「全体にVBA以外はダメ」って制限をかけていない限りは、
上でも、ACCESSを進めている人もいたけど、実用面から考えた回答も質問者の利益になると思うんだけど
(質問者がそう思っていても、何も知らないからそう思ってるってパターンすらあり得るかな)
943デフォルトの名無しさん (ワッチョイ 0bfa-weOF)
2018/01/22(月) 05:56:27.49ID:zmIcszTc0 >>942
Excel VBA質問スレでの「実用面」は、一般的な企業向けWindows PC(Office製品入り)で出来る事に制限されると思うけど。
それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。
だいたい他の言語に興味があるなら、その言語のスレで質問すりゃいいわけだし、
どんな自己弁護をしたところで特定言語のスレで他言語の話をする理由にはならないよ。
せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、
Rubyスレに誘導して、そちらで話を展開すべきだね。
Excel VBA質問スレでの「実用面」は、一般的な企業向けWindows PC(Office製品入り)で出来る事に制限されると思うけど。
それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。
だいたい他の言語に興味があるなら、その言語のスレで質問すりゃいいわけだし、
どんな自己弁護をしたところで特定言語のスレで他言語の話をする理由にはならないよ。
せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、
Rubyスレに誘導して、そちらで話を展開すべきだね。
944デフォルトの名無しさん (ワッチョイ 3deb-Qbx4)
2018/01/22(月) 08:37:35.39ID:AE7SVx7N0 >>943
> それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。
リアルでも、相手に聞きもせずに勝手にそんな縛りをかけて要件定義する人はいないと思うよ
> せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、
> Rubyスレに誘導して、そちらで話を展開すべきだね。
環境を聞くのは勿論ありだが、「○○だとより簡単にできるよ」ってこちらから言う事に何の問題があるのか?
今ある環境内で必ず実現する必要があるなら別だが、そうでない場合もよくあることでしょ
ま、いずれにせよ、何も聞かないうちに勝手に「○○に違いない」って決めつけるのは、
要件定義では一番しちゃいけないことだよ
> それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。
リアルでも、相手に聞きもせずに勝手にそんな縛りをかけて要件定義する人はいないと思うよ
> せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、
> Rubyスレに誘導して、そちらで話を展開すべきだね。
環境を聞くのは勿論ありだが、「○○だとより簡単にできるよ」ってこちらから言う事に何の問題があるのか?
今ある環境内で必ず実現する必要があるなら別だが、そうでない場合もよくあることでしょ
ま、いずれにせよ、何も聞かないうちに勝手に「○○に違いない」って決めつけるのは、
要件定義では一番しちゃいけないことだよ
レス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 日本損失1.7兆円に修正 中国渡航自粛の影響試算 [蚤の市★]
- 「どうしようもない」 ため息つくアジアの玄関口 中国の訪日自粛で−福岡市 [蚤の市★]
- 「アベノミクス」で投資対象と化したマンション ローンの低金利続き「年収の12倍」借りる20代出現 [蚤の市★]
- 食品の高騰対策、政府が交付金の「特別枠」検討 原則全ての自治体で [蚤の市★]
- 【超絶悲報】日本政府「高市さんの答弁撤回はない。政権として弱腰と映る姿勢は見せられない」これもう立憲岡田の議員辞職しかないだろ [519511584]
- 【実況】博衣こよりのえちえち朝こよ🧪
- 台湾「高市さんが台湾人の悲願を叶えてくれた!」これじゃ高市さん発言撤回できないぢゃん😰 [523957489]
- 高市周辺、さすがに焦り始めるww「小さな火種が火事になりかけている。早く鎮火しなくてはいけない」 [271912485]
- 【超悲報】中国への武力行使、世論調査で「賛成」「どちらかといえば賛成」48.8% 「反対」「どちらかといえば反対」の44.2%を上回る [314039747]
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
