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)
2018/01/01(月) 14:25:45.74ID:7yffOGmB0
知らないことを素直に知らないと言いなさい
2018/01/01(月) 14:27:07.60ID:tZ/lpIQo0
今年はいい年になるかなw
2018/01/01(月) 14:29:26.10ID:UomJiKNZ0
>>811
Workbook_AddinUninstall てのは知らなかったな。
Workbook_Open するのと効果は違うんだろうか?
2018/01/01(月) 14:54:13.21ID:ixsE+qrMx
またメゾット君が暴れてるな
あの馬鹿が出入りするようになってから荒れすぎ
2018/01/01(月) 15:45:18.49ID:bzNinO0Ma
>>814
よく考えろよ
2018/01/01(月) 16:11:19.12ID:PLRWaMeF0
>>816
おっと、 Workbook_AddinInstallを Workbook_AddinUninstallと書き間違えた
2018/01/02(火) 09:36:26.90ID:nA397GZea
>>817
だとしてもだ
イベントの言葉の意味そのままだよ
よく考えろよ
2018/01/02(火) 12:29:02.41ID:MKa2S+Tjd
>>818
「対象のアドインを参照設定しているブックを開いた」というイベントを想定してた
そうじゃないのね
2018/01/03(水) 10:57:08.56ID:rhTFyGx/0
>>803
そんなことはない。
設定値を保存するためのiniファイルの代わりにするとか、テンプレートの代わりにするとか、使い道は沢山ある。
2018/01/03(水) 11:46:24.84ID:ZpYRfYyG0
アドインにするにしてもなんにしても運用がしっかりされてないと意味がない
ファイル名やシート名程度が保証されてないならマクロ化なんて諦めろ
2018/01/03(水) 11:59:35.70ID:Uz65NhYa0
>>820
設定値を保存するのはやめたほうが良いと思うな。
バージョンアップしたときに設定値がリセットされてしまうとか、エクセルバグの巻き添えでブック破損の危険性がある。
できるだけアドインは読み取り専用で運用するべきだと思う。
過去に内部シートに保存するように作って問題が起きたので、バージョンアップ時にxmlにコンバートさせた事があるわ
2018/01/03(水) 12:49:50.09ID:lLEkaf6s0
お前のバグを根拠にされてもなぁ
2018/01/03(水) 14:45:49.49ID:hfgsKA7ma
まあ、設定は外出しにするのが普通に安全策じゃね?
xlamのシートは明らかに利用してほしくないっていう思いが伝わる作りな訳だから
2018/01/03(水) 15:32:51.77ID:00k1dN96d
利用者が不用意にセルデータをクリアしてそのままセーブしても自覚すらしないかも
2018/01/04(木) 05:46:13.89ID:UuI+tM4Q0
質問よろしくお願いします。

A列,B列,C列,D列
Aa,111,bbb,20
Bb,111,aaa,30
Aa,222,bbb,10
Bb,111,aaa,10
Aa,111,bbb,15

上記の様な表を下記の様にしたいです。

A列,B列,C列,D列
Aa,111,bbb,35
Aa,222,bbb,10
Bb,111,aaa,40

A,B,C列の値が一致したらD列を加算して行を削除するという処理です。データは約1000行程です。
2018/01/04(木) 06:37:20.49ID:MFccPkO20
1000行程度ならSUMIFSとかでできるんじゃないの
2018/01/04(木) 06:55:39.59ID:IcyEu6L/M
>>826
要件によるけどそういうビューを作ればいいんじゃね?
create view V as (
select A列,B列,C列,sum(D列) as D列
from 表
group by A列,B列,C列
)
2018/01/04(木) 06:57:20.78ID:IcyEu6L/M
すまん、寝ぼけててSQLスレと勘違いしてた...
>>828はなしで
2018/01/04(木) 07:39:39.14ID:IGCyfMcU0
>>826
見るからにデータベース向けの案件
集計するキーとなる列が左端一列、その右に合計対象の数値列という2列形式なら
データタブにある統合でできるんだが
2018/01/04(木) 08:01:11.56ID:5mprgbRzp
>>827
すみません説明不足でした。
キー項目が1000種類以上あり、毎回CSVから読み込んでから処理をする為、事前にWorkSheet関数を作っておくのが難しい状況です。

何か手はありますか?
2018/01/04(木) 10:15:47.38ID:fF+rBx/60
データベース系のデータは素直にデータベースソフトで管理しようよ・・・。
アクセスでやればマウス操作だけで終わる様な問題だよ。
2018/01/04(木) 10:22:48.62ID:d1LyNdol0
>>831
ADOでcsvファイルをデータベースとして接続して >>828 に挙げられた
SELECT文を実行する、という手段がとれる
2018/01/04(木) 10:31:44.20ID:no6Ylxj0a
sqlならselectとorder byだけですむ案件だな
愚直にプログラム組むと厄介だけどね
2018/01/04(木) 10:38:07.48ID:7zx5w2nrd
ピボットでいいんじゃね
2018/01/04(木) 11:56:10.93ID:iFN99ve4d
LINQって使えないんだっけ?
2018/01/04(木) 13:22:48.32ID:Gj6t78kg0
>>826
嘔吐フィルターかけてソートしてから
一致を上からみて加算と消去
フィルター解除忘れずに(多分ソート直後にすぐ)
2018/01/04(木) 13:42:37.28ID:hO93+Igl0
>>826

上級者じゃない俺なんかこういうのみると
全部2次元配列にぶちこんでif多用して無理矢理やっちゃうんだけど
そういうのはだめなの?
2018/01/04(木) 13:47:48.60ID:cJgHrV+ta
>>838
だめじゃないし、初心者なら無理やりVBAで組むのも勉強になるよ
重複の無いリスト作るのがやや面倒というか、煩雑になりがちなところだな
エクセルの機能使えばいいっちゃいいけど、好みじゃないな
2018/01/04(木) 13:55:27.88ID:hO93+Igl0
>>839
おれこういうの無理矢理やっちゃうの大好きで完成すると充実感半端ない
俺が組むマクロってそんなのばかりだ
基本初心者レベルの知識しか使わないでやっちゃうんで、
こういう質問をする人は、無理矢理やると遅くなるとか別の理由があって聞いてるのかな?
とか思っちゃう
2018/01/04(木) 15:19:59.75ID:kPmYITG+0
ファーム1の中に、オプションボタンが18個あり、オブジェクト名を『OP_1』〜『OP_18』としてボタン1を押してフォーム2に切り替える時に選択されてるオプションボタンのキャプションを取得して変数TUR1に入れたいんですけどどうしたらいいですか?
2018/01/04(木) 16:20:08.23ID:pGh8JphK0
>>841
For i = 1 To 18
With Me.Controls("OP_" & CStr(i))
If .Value = True Then
TUR1 = .Caption
Exit For
End If
End With
Next
2018/01/04(木) 17:41:48.62ID:uhyB+DSmd
初心者なんだけど以下のような表から特定のセルに入力された場合だけ、特定のセルをカウントする方法ってありますか?
Aは全て
Bは選ばれたものだけ、みたいな

Aの全てをカウントするのはわけないんだけど、Bの選ばれたものだけをカウントする方法がわからない
IF使うにしても何を指定すればいいのでしょう?

わかりにくかてすいません
2018/01/04(木) 17:54:54.38ID:IwnGnNnba
>>840
普通にやり方がわからないんじゃないの
>>843
cがキーになるなら重複しないcの一覧をつくって二次元配列でも構造体でもいいけどbがtrueならカウントするっていう風にすればいいと思う
件数多いならDBの領分だと思うけどね、この手の集計は
2018/01/04(木) 18:02:17.19ID:HiTEnEcXd
>>842
ありがとうございます!
2018/01/04(木) 18:13:43.61ID:uhyB+DSmd
>>844
Bがtrueなら、というのはどうやって指定すればいいですか?
範囲指定で
2018/01/04(木) 18:23:20.07ID:uhyB+DSmd
すいません、間違えて書き込んでしまいました

>>844
Bがtrueなら、というのはどうやって指定すればいいですか?
範囲指定でがっつりやると、指定した範囲に一つでもtrueがあるとカウントしてしまって結局全部をカウントしてしまうんです
2018/01/04(木) 18:27:59.94ID:iMxAIJokM
>>826
何も難しく考えなくても、E列に=A&B&Cを入れて、E列を行ラベルにしてピボットテーブルで集計するだけで出来るよ。
ABC列をもどしたいならINDEX,MATCHで引っ張って来ないといけないけども、日々エクセル使ってる人なら手慣れたものだと思う。と言うか慣れておくと色々便利。
詳しい解説いるならする
2018/01/04(木) 18:58:58.92ID:IwnGnNnba
>>847
一行ずつループしてるんだよね?
フラグ用に変数用意してるなら一ループごとに初期化し直さないとだめよ
ってか、今どんなコードで動かしてるか書いてくれるとやり易いんだけど
2018/01/05(金) 02:37:52.28ID:UixpopG00
フィルタとCOUNTIFで良い気がするが
どうしてもVBAでやりたいのか?
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との組み合わせでクリックできないので何か手段があれば教えて頂きたいです。
2018/01/05(金) 21:06:25.46ID:UyFZaUswa
>>826
そういう処理だったらソートしても問題無さそうだからソートしてループで良いんじゃね?

>>851
4桁の数字以外共通だとどうしてForとGetElementsByTagnameとの組み合わせでクリック出来ないのかが分からん。
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
2018/01/05(金) 22:16:41.06ID:vO88ak3C0
DOMに親要素とか隣の要素を見ていくのあったよね
あれで必要なだけ移動させればいいんじゃね
2018/01/05(金) 22:20:08.87ID:vO88ak3C0
>>826
>>833の方法で頑張ってコードにしたのを書き込みたいんだけど
403になっちゃうのよね
禁断のコードが含まれているのかしら
856デフォルトの名無しさん
垢版 |
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文を書く必要がある。
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
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
2018/01/12(金) 01:30:55.27ID:GWvM9lig0
>>858
Excel2003はサポート切れてますので
Excel2007にのりかえましょう
862デフォルトの名無しさん
垢版 |
2018/01/12(金) 01:41:04.62
>>861
Excel2007なら>>858できるん?(´・ω・`)
2018/01/12(金) 15:56:41.55ID:kdQVxAch0
0回目って何?
2018/01/12(金) 19:59:42.26ID:8L8z7qJh0
vbModelessで開いたUserForm上のTextBoxにSetFocusするようInitializeに記述しても効きません
これって無理なんですかね?
vbModelessを切るとフォーカスがちゃんとTextBoxに移るんですけどね
2018/01/12(金) 23:20:03.95ID:Ln5WwMFr0
初期状態でフォーカスを当てたいなら
UserForm.Show vbModeless
UserForm.TextBox.SetFocus
とフォームを呼んでいるプロシージャ側に書く

フォームのイベントならActivateでどうでしょう
毎回フォームがアクティブになるたびフォーカスしちゃうけど

Initializeがなぜはしらないのかは知らない
2018/01/12(金) 23:44:10.99ID:Ln5WwMFr0
実験してみたらInitializeは呼ばれてるけど
SetFocusだけがだめみたい
他のことは普通にできる
なんでしょうね
2018/01/12(金) 23:46:18.93ID:WKndAwKhM
いやExsel 2007もサポート切れてますが
2018/01/13(土) 03:26:50.74ID:0Hr8k8ED0
>>866
自分でもいろいろやってみたんですけどやっぱりダメみたいですね
ありがとうございました
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だと誤爆するという意味不明さ。
ハンドルがずれる的なバグでもあるのでしょうか?
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
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程です。
出来る方、よろしくお願いします。
873デフォルトの名無しさん
垢版 |
2018/01/13(土) 10:29:13.82
>>870
LWA_COLORKEYは指定した色を透明にするんだから、
その他人のPCでExcelのウィンドウの色が違うんじゃね?

知らんけど
2018/01/13(土) 10:31:29.99ID:uYJANG/vd
既存プログラムで引数が多いやつを減らしたいんだけどどうすればいい?
ただグローバル変数使うと他のアプリケーションに影響出るから使えない。
今から構造化やクラスにするのは名前変更が大変そうだし、同じ型でも同じ動作でもないからまとめにくい。
875デフォルトの名無しさん (ワッチョイ 118a-zETe)
垢版 |
2018/01/13(土) 10:39:42.82ID:8yN0Kzpj0
>>873
それが、コマンドボタンとシートの色を同じにしても、
コマンドボタンの方だけ透過されるんです。

しかも最初に配置したコマンドボタンだけ。
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,"一致データ無し")
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

変えているのは最後の引数だけなんですが。
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
2018/01/13(土) 13:04:46.60ID:WLDq+ue70
>>876
列の挿入や削除の処理があるので、数式だと参照ズレなどが起こってしまうので出来たらVBAで処理したいと考えています。
2018/01/13(土) 13:29:13.07ID:eGapce6A0
>>861
Excel2010を用意しました。

>>859
エクセルで「Book1」「Book2」「Book3」を開いた状態で、
「Book1」「Book2」を並べて比較している時に、
ペアになっている「Book1」「Book2」を特定する方法、
もしくは「Book1」がActiveWorkbookの時に「Book2」を特定する方法が知りたいのです。
881デフォルトの名無しさん
垢版 |
2018/01/13(土) 13:42:21.62
>>880
計算式でできればVBAでもそのままできるやん
>>856参照
2018/01/13(土) 13:47:55.56ID:fyAvIt7m0
並べて比較って
人間が何かを見比べて確認しているわけだから
その作業は人間がやる必要ないとおもうので
全部VBAでバックグランドで処理すればいいのではないかと単純に思ってしまう
最後に比較した結果だけ表示してあげる
883デフォルトの名無しさん (ワッチョイ 1188-/4a5)
垢版 |
2018/01/13(土) 15:21:57.51ID:eGapce6A0
>>881
比較自体は計算式でできますが、
比較する対象を特定する事は計算式でできない気がします。

>>882
挿入等によって比較したい箇所がBook1と2で異なる可能性がある為、
事前に比較の起点となる箇所を選択する必要があります。
884デフォルトの名無しさん
垢版 |
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

列の追加削除があるということだったら列番号も変数化すればいい
885デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
垢版 |
2018/01/13(土) 17:00:25.96ID:zzyV/8sb0
初心者で申し訳ありません
セルに入力した選手コードを選手名に置換するような動きをさせたいのですがどうするとよいでしょうか
別のシートに選手名簿は用意してありA列に選手コードB列に選手名があります
2018/01/13(土) 17:42:32.57ID:8qhapkmN0
>>885
VBA要らん
VLOOKUPでググれ
2018/01/13(土) 17:48:09.64ID:8qhapkmN0
すまん「置換」を見落とした
VBAは要るな
WorksheetFunction.VLookup でやるなり、ループで検索するなりやればいい
2018/01/13(土) 17:50:29.11ID:gLbKwyK9x
>>885
普通はセルに入力された選手コードをわざわざVBA置換するなんてことはしないで、VLOOKUP等のワークシート関数を書くけどね
置換操作をVBAで書かなきゃいけない理由はあるの?
889デフォルトの名無しさん
垢版 |
2018/01/13(土) 17:58:56.84
>>885
>セルに入力した選手コードを選手名に置換するような動きをさせたい

セルに選手コードを入力して、Enterを押した途端に選手名に置き換わるような動きをさせたいんだな?そうなんだな?
2018/01/13(土) 18:00:41.47ID:gLbKwyK9x
>>887
検索置換のダイアログでシート内の選手コードを一括変換する、みたいな手作業の業務手順をそのままマクロ化しようとしているのかもしれないし、そういう場合はそもそもシートの設計や業務手順に問題がある場合が多い。
最初にVLOOKUP使えと指摘したあんたの感覚は基本的には正しいと思うぞ。
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

シートのインデックスとかは書き換えてね
意味不明ならマクロ記録かさらなる修行をオススメする
2018/01/13(土) 18:07:34.63ID:gLbKwyK9x
>>889
VBAに慣れてる人ならセル値の置換と聞いただけでワークシート更新イベントを使いたいのかなって思いがちだよな
俺も最初はそう思ったわ
でも質問者の質問内容を推測抜きで素直に読むとそうとは限らないんだよな
893デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
垢版 |
2018/01/13(土) 18:19:24.76ID:zzyV/8sb0
>>888
トーナメントの結果を入力するようになっているのですが既に報告用ワークシートはあるのですが入力件数が多くなりすぎて最終的にはバーコードによる入力を試みようとしています
また、その報告用ワークシートは書式が決まっており並べ替えエラーチェックのマクロが既にあるので行を入れたりして関数をいれる対応ができないという状態です
>>889
入力後にマクロ実行用のボタンを押して置換するような想定でした
エンターを押した瞬間変わるものでも大丈夫です
894デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
垢版 |
2018/01/13(土) 18:35:21.45ID:zzyV/8sb0
>>887
>>891
ありがとうございます
家に帰り次第試してみます
>>890
今まではワークシート内から対戦選手の名前を探してきてコピーアンドペーストで対応していたのですが参加者が年々増えてきて(今年の見込みは約千人位)追い付かなくなってきたために速度向上を目的としています
2018/01/13(土) 18:44:45.15ID:eGapce6A0
>>884
VBAに記述のあるWorksheets("Sheet1") の箇所を、
並べて比較でペアにしているシートに特定する方法が思いつかないのです。
2018/01/13(土) 19:03:27.44ID:rZTV+Qsta
>>895
ファイル名とかシート名がランダムでないなら
固定値じゃないの?
どんなファイル名か分からない、シート名か分からないってなら都度入力するしかないな。
データ形式で特定することもできるけど、
無駄な作業にしか思えない。
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
2018/01/13(土) 19:32:04.47ID:eGapce6A0
>>896
ファイルのフォーマットが複数あるので、
事前にファイル名とシート名を規定できないのです。
なので、せめてペアにしたファイル同士が特定できれば、
ファイルとシートを選択する手間が省けると思ったのですが・・・

3つ以上開けなくなるけど、workbooksからマクロブックを除外した先頭2つを比較する方法で考えてみます。
2018/01/13(土) 19:36:48.93ID:6HVsHBKb0
>>898
それは運用を変えよう。機械的に処理するなら人間側が合わせる必要がある。
手動で命名規則に沿うか、命名自体を自動的にして人間が意識しないようにするか。
2018/01/13(土) 23:03:28.12ID:aJN0Dby50
エクセル2010でCSVファイルを開いた場合、
UTF8やshiftjisを自動で判定して表示してくれますが、
この時に判定された文字コードを取得する方法はありますか。

用途は、外部データの取り込みでCSVを開きなおすための文字コードの特定です。
901デフォルトの名無しさん (ワッチョイ 8903-YNmt)
垢版 |
2018/01/13(土) 23:14:29.83ID:odSwvUdp0
>>900
application.nkf
2018/01/13(土) 23:28:32.80ID:aJN0Dby50
>>901
ありがとうございます。
試してみます。
2018/01/14(日) 06:58:25.18ID:UVUQYwWb0
>>902
いいってことよ(´・ω・`)b
904デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
垢版 |
2018/01/15(月) 01:08:16.65ID:Zqan8uZj0
>>897
実行時エラー13
型が一致しませんとなっていて
For~の行でエラーを出していて止まるみたいです
あと報告シートが選手の強さ別に複数に分かれているのですが今選手コードの入力したシート(つまりいま開いているマクロ実行用のボタンを押したシート)を処理したいという場合どうするとよいのか教えていただけると助かります
2018/01/15(月) 01:48:08.96ID:ubg4QImpx
>>904
エラーの出たコードを転載して見せてもらえませんか?こちらの環境ではうまく動いているんですが、私がコードを転載したときにミスをしたかもしれないので

それから、コードはボタンマクロ(ボタン名_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にしてボタンの名前と場所をかえるつもりでしたがあまりよくない方法なのでしょうか
必要であれば既にあるコードを出しますので教えてください
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

オブジェクトの参照方法が違うのでしょうか。
2018/01/15(月) 23:02:33.00ID:JvjYqsKWx
>>906
申し訳ない、Forの行でEnd("xlDown")となってるの、自分の転記ミスでした
エラーの原因もこれでしょう
二重引用符なしでEnd(xlDown)と書き直して動かしてみてください
2018/01/16(火) 12:17:16.43ID:SelV7zwId
質問です。

ソルバーで普通は目的セルをrangeなどで指定しますが、シートのセルにアクセスせず、vba内の変数を直接ソルバーにかけてvba内だけで完結したいのですが、方法あるでしょうか?
910デフォルトの名無しさん (ワッチョイ f1f7-GMp/)
垢版 |
2018/01/17(水) 02:18:24.01ID:x8yvrTsd0
>>908
うまくいきました
ありがとうごさいます
2018/01/20(土) 12:24:27.92ID:sSjH/Vu40
セルのA列にある文字列をコンボboxにaddですべて入れた後に、一文字入力する度に候補が絞られてくって出来ます?
コード教えてもらえないですか?
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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