X



Excel VBA 質問スレ Part63
■ このスレッドは過去ログ倉庫に格納されています
0168デフォルトの名無しさん (ワッチョイ b501-Qh1z)
垢版 |
2019/10/05(土) 22:49:37.62ID:cygEmLxv0
特定フォルダの中のファイル名を取得したくて、A1にファイルパスが書いてあってあったとき
Dim fname As String fname = "DirSample.xlsx" 
の"DirSample.xlsx"の部分をA1のパスにしたいのですが、どうやった良いですか?
0171デフォルトの名無しさん (オッペケ Srbd-ckhU)
垢版 |
2019/10/06(日) 01:50:18.38ID:yv4ZtA4Er
>>5
このQueryTablesなんですけど、セル内改行を含むCSVを読み込むにはどうしたらいいですかね?
改行コードをいじってみたりしたけど駄目でした
0172デフォルトの名無しさん (ラクペッ MM65-CrRW)
垢版 |
2019/10/06(日) 08:08:24.51ID:eVUjMqzVM
>>171
CSVで「セル内改行」?
意味が分からん
0176デフォルトの名無しさん (アークセー Sxbd-2RUv)
垢版 |
2019/10/06(日) 13:10:14.83ID:H1C9JflMx
>>171
QueryTableをコード内でAddするんじゃなくて、予めPowerQueryでセル内改行の処理を埋め込んだ接続を作っておいて、コード実行時にデータの読み込みとテーブル出力だけすればいいんじゃないの
0177デフォルトの名無しさん (オッペケ Srbd-ckhU)
垢版 |
2019/10/06(日) 21:50:03.52ID:yv4ZtA4Er
>>174
セル内改行をLFにしたり色々試したんですけど駄目でした
結局一時ファイルを作って開いてからコピペという泥臭い処理に…
0178デフォルトの名無しさん (オッペケ Srbd-ckhU)
垢版 |
2019/10/06(日) 21:50:35.79ID:yv4ZtA4Er
>>176
PowerQueryですか
調べてみます
0179デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/06(日) 22:04:38.99ID:lVV4IJR90
VBAある表のデータで行と列が一致する列の値を返すコードを書きたいのですがどうしたらいいでしょうか?
行だけならVLOOKUPで行けると思うのですが列になるとどうしてラいいのかわかりません。
該当するセルの値を返したいです。
0181デフォルトの名無しさん (アークセー Sxbd-2RUv)
垢版 |
2019/10/06(日) 22:28:18.73ID:H1C9JflMx
>>179
行と列が一致するってどういうこと?

行インデックスと列インデックスが一緒ってこと?

それとも、行と列を特定するための条件が個別にあって、それらの条件を満たすってこと?
0184デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/06(日) 23:02:28.07ID:lVV4IJR90
>>181
後者です。
シートに参照する表がありユーザーフォームで作った入力表がコンボボックスとなり
一つ目のコンボボックスが行とリンクしていて、二つめのコンボボックスが列と連動して言いて
行と列の一致した値をテキストボックスに表示させたい。
一つだけならVLOOOKUPでできるのですが表となると私の力だと全く思い浮かびません。
力といってもちょっと基本がわかって参考書とインターネットの中から使えそうなコード
を引っ張ってきて使えるように修正するくらいで一から工程を考え出す事は難しいです。
0185デフォルトの名無しさん (ワッチョイ b501-Qh1z)
垢版 |
2019/10/06(日) 23:09:13.37ID:ZjSVYIsg0
ワークシートのchangeプロシージャで
A1:F5  A6:E6 A7:I105  に変更が加わったとき Range("F6") = Date をさせたいのだけど

If Intersect(Target, Union(Range("A1:F5"), Range("A6:E6"), Range("A7:I105"))) Is Nothing Then

ではうまくいきません。どなたか教えてください。

あと、セルに文字を入力するとき、対象となるセルを選択し、文字を入力したら、別のセルに入力途中の文字が表示され、Enterをおしたら対象となるセルに反映されました。
これもどうしたら普通通りになりますか?
0186デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/06(日) 23:14:57.48ID:lVV4IJR90
>>183
しいて言うならVLOOKUPとHLOOKUPの合わせる感じ?
0189デフォルトの名無しさん (ワッチョイ ea2c-2rUB)
垢版 |
2019/10/06(日) 23:45:57.04ID:ddN6wFVd0
Ruby では、2次元配列[ 行 ][ 列 ]で、そのセルを指せる。
ただし、行列のインデックスは、0 から始まる

require 'csv'

str = <<"EOT"
1,a,x
2,b,y
EOT

p table = CSV.parse( str )
#=> [["1", "a", "x"], ["2", "b", "y"]]

p table[ 1 ][ 2 ] #=> "y"
019249 (ワッチョイ 7991-rYlP)
垢版 |
2019/10/07(月) 13:22:02.42ID:paP7R7pw0
>>177
まず考えるべきはバイナリエディタで該当ファイルを開いて、どういう構造になってるのかを確認することだよ。
0196デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/08(火) 00:24:14.75ID:HDWpL7A50
〉〉184です。教えてもらった通りVLOOKUPとマッチ関数で作ってみたのですが
うまく言いません。通常のエクセルの状態ではやりたいように動作したのですができればVBAで動作できるようにしたいです、

Sub 行と列()
Dim tateya As String
Dim gouki As String
Dim gouki2 As String
Dim siriaru As String
Dim test As Worksheet
Set test = Worksheets("テスト")
tateya = test.Range("a1")
gouki = test.Range("a2")
haihhun = "-"
gouki2 = tateya & haihhun & gouki '号機
Dim siri As Worksheet
Set siri = Worksheets("シリアル管理")
Dim hanni_seru As Variant '範囲指定はバリアント型を使用する事
hanni_seru = siri.Range("D1:L39")
'VLOOKUP(列の条件,A1:D5,MATCH(行の条件,A1:D1))
siriaru = WorksheetFunction.VLookup(gouki2, hanni_seru, WorksheetFunction.Match("H1", "D1:L1"))
MsgBox siriaru
End Sub
0197デフォルトの名無しさん (アークセー Sxbd-2RUv)
垢版 |
2019/10/08(火) 02:02:42.66ID:l+0JwRkcx
>>196
たぶんMatchの行条件がおかしいけど、どんな問題が起きてるのか分からないから何とも言えない

それから、haihhunとかsiriaruとかhanni_seruとか変数の名前がちょっと酷い
HyphenとかSerialとかとかCellとか英語をきちんと使う意識を持つのが上達の近道だと思う
0200デフォルトの名無しさん (アメ MM11-pTrw)
垢版 |
2019/10/08(火) 07:37:46.07ID:wEzHRAYiM
〉〉196です。
変数名もそんなルールが?
なんとなく日本語はよくないなーと思って自分で分かるローマ字で表記しようと思ったんですが、後ダメな理由がマッチ関数にワークシート指定してないからかと推察。後で試します。
0201デフォルトの名無しさん (ワントンキン MM7a-arkt)
垢版 |
2019/10/08(火) 07:52:03.60ID:o1U1FjwuM
無理に英語やローマ字にするくらいなら日本語でいいと思うけど
あとrangeだけじゃなくてcellsも覚えれば目的達成するんじゃないか
cellsのrowとcolumnで行と列を取得出来るからね
0202デフォルトの名無しさん (アークセー Sxbd-2RUv)
垢版 |
2019/10/08(火) 08:16:32.23ID:l+0JwRkcx
>>199
ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い

Publicにするのが嫌なら、呼び出したいPrivate Subが定義されたモジュールにコールバック用の引数付きでPublic Subを定義して、呼び出したい任意のPrivate Subを引数で指定して呼び出せるようにする
それも嫌ならクラスを作ってPrivate Subをメソッド化する

どちらもコーディングや保守の工数は大して変わらない
0203デフォルトの名無しさん (ワッチョイ 3968-G1PU)
垢版 |
2019/10/08(火) 20:03:58.77ID:XnwML2Ug0
>>202
>ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
まさにこれです!privateにしなくても出来たんですね、勉強になりました。ありがとうございました

他の方法も勉強になりました
0205デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/08(火) 21:30:26.55ID:HDWpL7A50
>>200
ありがとうございます。
コメントつけまくって分かるようにしてます。
まぁ詳しい人が見たらめっちゃくちゃで分かりにくいと思うのですが、
自分用で自分が分かればいいので動くようにして少しづつ改良していきます。
多分、めっちゃ不具合あります。
0206デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/08(火) 22:01:56.51ID:HDWpL7A50
データベースから原本のシートに転記する場合表内でのループは可能ですか?
但し、実際に転記する表の上下に題名や表題があります。
例えば1行から20行での表があり繰り返すデータが21行目なったら2ページめの1行目
にするという事は可能でしょうか?
出来なさそうなのでリストボックスで見やすく作ろうかと思ったのですが、印刷用でも
作成したいのでできるのであればご教授お願いします。

上だけなら、forの頭を指定して10番目ならfor i = 10TO 最終行
で行けると思うのですが表の最後の指定がわかりません。
forをネストすればできそうですが、それでも20番目でおわる形にする感じ?
21行目を2ページ目の1行目を指定するのは難しそう
0213デフォルトの名無しさん (ワッチョイ 9fda-OHYr)
垢版 |
2019/10/10(木) 21:48:01.84ID:5Xxw1b5M0
頑張れば何でもできるだろうな。

VBSではWindowsAPIが使えない! → 裏でこっそりエクセル起動すれば使えるじゃん。
VBAではjavascriptが使えない! → ExecuteThisJavaScript使えば出来るじゃん。

殆ど屁理屈だけど。
021649 (ワッチョイ f791-mVPP)
垢版 |
2019/10/11(金) 15:44:34.63ID:3jXa2BKX0
>>211
>>212
>>213
出来るぜ。
−応ここVBAのスレだから言うけどVBAでも全部できる。
今流行りのRPAがやってることは全部出来る。
021749 (ワッチョイ f791-mVPP)
垢版 |
2019/10/11(金) 15:50:38.03ID:3jXa2BKX0
ただ、VBSでWindowsAPIは苦肉の策というか、敬遠したい気持ちもある。
まっ、VBSが最適な話なら結局使うけどね。

VBAでJavaScriptも同様だね。
こっちの方が敬遠したい。
まずはVBAだけで何とかならないかを考える。
0236デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/12(土) 20:28:16.78ID:grx7Z1qlx
経験則から言うと、エクセルのシートを入力フォームや書類のフォーマットのように捉えてる人はRangeを使いがちで、配列やテーブルとして扱えるオブジェクトの塊だと捉えてる人はCellsを使う傾向がある
0237デフォルトの名無しさん (ワッチョイ bfad-la4p)
垢版 |
2019/10/13(日) 00:25:27.70ID:ZLXCWom40
あるリストをユーザーフォームで絞り込んでそのユーザーフォームのリストボックスに
リスト内容を表示させたいのですがオートフィルタの表示はうまくいくってるのですがリストの表示
先がうまく表示されません。どうしたらいいでしょうか?
以下がコードです
private Sub kensaku_bo_Click()
'オートフィルタによる検索
Dim ws_kiki As Worksheet
Set ws_kiki = Worksheets("機器履歴")
Dim tateya As String '建屋番号
Dim gouki As String '号機番号
Dim gouki2 As String '建屋と号機の合計のセル
Dim haihhun As String
Dim myData As Variant
tateya = ken1.Value
gouki = ken2.Value
haihhun = "-"
gouki2 = tateya & haihhun & gouki '号機
ws_kiki.Range("A1").AutoFilter 3, gouki2
Dim lastRow As Long
With ws_kiki
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 12).End(xlUp)).Value
End With
With list_ken
.ColumnCount = 12
.ColumnWidths = "50;80;50;50;50;50;50;50;50;50;50;50"
.List = myData
End With End Sub
0240デフォルトの名無しさん (ワッチョイ bff7-n5Mu)
垢版 |
2019/10/13(日) 09:49:37.23ID:EzRorSmA0
間違えたmyDataは配列か
それでもフィルター情報は乗らないね
リストボックスの.RowSourceに範囲アドレス入れて連動させる方法あるけど
これフィルターも連動したっけ?
0241デフォルトの名無しさん (ワッチョイ 1fba-7XqI)
垢版 |
2019/10/13(日) 15:30:11.40ID:8j4dObBs0
セルC5:C17に数値が入ってます(A)
セルF5:F21に数値が入ってます (B)
セルY5:Y25に数値が入ってます (C)

AとBの数値のうちCにない数値をセルO5から順番に下に抜き出したいんです

cを配列で格納するまでは出来たのですがそれ以降がわかりません
よろしくお願いします

初心者です
0247デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/13(日) 18:24:09.39ID:0JmSqCe7x
普通のCollectionや配列よりも、Cの値をKeyにしてDictionaryオブジェクトを作る発想の方がいいと思う
Dictionary.ExistsメソッドでKeyの存在確認ができるからコードが簡単になる
0250デフォルトの名無しさん (ワッチョイ f768-NJTS)
垢版 |
2019/10/13(日) 21:32:01.32ID:z6dVpON+0
連想配列の事をdictionaryって呼ぶんだっけか
すごい便利だけど、シートあるんだからシート使った方がいいんでない?と思う
二次配列が目に見えて編集し放題とか楽ちんすぎる
0258デフォルトの名無しさん (アークセー Sxcb-FpGY)
垢版 |
2019/10/13(日) 22:13:33.97ID:0JmSqCe7x
シートが可視化された配列だってのはその通りなんだけど誰でもGUIで簡単に編集できてしまう点が逆に弱点でもある
値の読み書きだけでイベントハンドラに制御が渡るからそもそも重いし
0262デフォルトの名無しさん (アウアウウー Sa5b-8cCB)
垢版 |
2019/10/13(日) 23:09:26.19ID:YeAfr+Aea
>>241
こういうこと?
Sub 検索()
Const COL_C As Long = 3
Const COL_F As Long = 6
Const COL_O As Long = 15
Dim nSetRow As Long
nSetRow = 5
Dim nRow As Long
For nRow = 5 To 17
If Not IsExistValue(Cells(nRow, COL_C).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_C).Value
nSetRow = nSetRow + 1
End If
Next
For nRow = 5 To 21
If Not IsExistValue(Cells(nRow, COL_F).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_F).Value
nSetRow = nSetRow + 1
End If
Next
End Sub
0263デフォルトの名無しさん (アウアウウー Sa5b-8cCB)
垢版 |
2019/10/13(日) 23:09:42.80ID:YeAfr+Aea
Function IsExistValue(ByVal pValue As Variant) As Boolean
IsExistValue = True
Const COL_Y As Long = 25
Dim nRow As Long
For nRow = 5 To 25
If Cells(nRow, COL_Y).Value = pValue Then
Exit Function
End If
Next
IsExistValue = False
End Function
0265デフォルトの名無しさん (ワッチョイ 9fe0-o74w)
垢版 |
2019/10/14(月) 00:48:24.78ID:2bLpiP0X0
2シートを連結する際、それぞれの各行をクラスインスタンスに代入&コレクション化してるのですが連結方法に悩んでいます

Personクラス(pID, 氏名, 名字プロパティ, 生年月日,...)→Persons.Add Personインスタンス, str(pID)
Diaryクラス(dID, pID, 作成日, 本文,...)→Diaries.Add Diaryインスタンス, str(dID)
'出力
Dim d as Diary
For each d in Diaries
if(存在チェック) then xxx = Persons.Item(d.pID).名字
Next d

現在上記のように回してますが、より楽に書けるor固いor保守しやすい...実装があれば教えて頂きたいです
現状はプロパティの予測表示がされないのが微妙に使いにくいのと、そもそもコレクションにおけるkeyの動作をよく分かっていません
0267デフォルトの名無しさん (ワッチョイ bf68-NJTS)
垢版 |
2019/10/14(月) 09:29:31.58ID:+oSE7p5I0
VBAでOPENしたファイルを引数で渡す事は出来ますか?
こんな感じで処理したいのですが、「#1」って変数では無いのでしょうか

Sub foo()
Open "TESTFILE" For Output As #1 ' Open file for output.
Call write_(#1,"content")
Close #1
End Sub

Function write_(filenumber, content)
Write filenumber, content
End Function
■ このスレッドは過去ログ倉庫に格納されています

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