Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


291 / 3841 ページ ←次へ | 前へ→

【76613】Re:VLOOKUPで一致した場合に特定の数値を...
発言  β  - 15/2/10(火) 8:39 -

引用なし
パスワード
   ▼vba初心者 さん:

関数を使わない処理案です。

Sub test2()
  Dim sh1 As Worksheet
  Dim sh2 As Worksheet
  Dim dic As Object
  Dim v As Variant
  Dim i As Long
  Dim c As Range
  
  Set sh1 = ThisWorkbook.Sheets("Sheet1")
  Set sh2 = Workbooks("Book2.xlsx").Sheets("Sheet1")
  Set dic = CreateObject("Scripting.Dictionary")
  
  'Book2のA列の値を格納
  
  For Each c In sh2.Range("A2", sh2.Range("A" & Rows.Count).End(xlUp))
    dic(c.Value) = True
  Next
  
  With sh1.Range("v2", sh1.Range("v" & Rows.Count).End(xlUp))
    'Book1 の U,V列を配列に格納
    v = .Cells.Offset(, -1).Resize(, 2).Value
    '配列内で重複チェック
    For i = LBound(v, 1) To UBound(v, 1)
      If dic.exists(v(i, 2)) Then
        v(i, 1) = 1933
      Else
        v(i, 1) = Empty
      End If
    Next
    'Book1に書き戻し
    .Cells.Offset(, -1).Resize(, 2).Value = v
  End With
  
End Sub
・ツリー全体表示

【76612】Re:VLOOKUPで一致した場合に特定の数値を...
発言  β  - 15/2/10(火) 6:37 -

引用なし
パスワード
   ▼vba初心者 さん:

kanabunさんの投稿で、あぁそうだったのかと理解しました。
同じ行にあるものの比較ではなく、その列にあるかどうかだったんですね。
であれば、kanabunさんの指摘通り MATCH でしょうね。
で、かりに行数が極端に多い場合(10,000行とか)は、数式埋め込みではなく
別の方式がいいかもしれません。
・ツリー全体表示

【76611】Re:VLOOKUPで一致した場合に特定の数値を...
発言  kanabun  - 15/2/9(月) 22:15 -

引用なし
パスワード
   ▼vba初心者 さん:

>BOOK1のV列とBOOK2のA列を比較し、一致するならBOOK1のU列に
>1699 と数字を入れたく思います
>一致しなければ何もしません

ある列とある列の比較なら VLOOKUP より MATCH でしょうね

Sub Try1()
 Dim r As Range, u As Range
 Dim a As Range, aAddress As String
 
 With Workbooks("Book1.xls").Worksheets(1)
   Set r = .Range("V2", .Cells(.Rows.Count, "V").End(xlUp))
   Set u = r.Offset(, -1)
 End With
 With Workbooks("Book2.xls").Worksheets(1)
   Set a = .Range("A2", .Cells(.Rows.Count, "A").End(xlUp))
   aAddress = a.Address(External:=True)
 End With
 'U列に数式(V列と Book2のA列と照合して、一致したら 1699、なければ "" )
 u.Formula = "=IF(ISNUMBER(MATCH(V2," & aAddress & ",0)),1699,"""")"
 
End Sub
・ツリー全体表示

【76610】Re:VLOOKUPで一致した場合に特定の数値を...
発言  β  - 15/2/9(月) 22:12 -

引用なし
パスワード
   ▼vba初心者 さん:

こんばんは

シート関数を埋め込んで、そのあと値に変換しています。

Book1もBook2もシート名を"Sheet1"としています。

Sub Test()
  Dim sh As Worksheet
  Dim sh2 As String
  Dim bk2 As String
  
  'マクロブック側
  Set sh = ThisWorkbook.Sheets("Sheet1")
  
  'Book2側
  bk2 = "Book2.xlsx"
  sh2 = "Sheet1"
  
  With sh.Range("V2", sh.Range("V" & Rows.Count).End(xlUp))
    .Offset(, 1).Formula = "=IF(V2=[" & bk2 & "]" & sh2 & "!A2,1699,"""")"
    .Offset(, 1).Value = .Offset(, 1).Value
  End With
  
End Sub
・ツリー全体表示

【76609】VLOOKUPで一致した場合に特定の数値を返...
質問  vba初心者  - 15/2/9(月) 21:08 -

引用なし
パスワード
   BOOK1とBOOK2のデータをマッチングして、
BOOK1に数字を入れたい

BOOK1とBOOK2が、両方立ち上がっています

BOOK1にコードを組み込んで実施したいと思います
BOOK1のV列とBOOK2のA列を比較し、一致するならBOOK1のU列に
1699 と数字を入れたく思います
一致しなければ何もしません

A列、U列、V列全て、2行目から始まります

VBAで行なうにはどのようにすれば良いでしょうか?

お力を貸して下さい
・ツリー全体表示

【76608】Re:入れ子の親タグのテキスト取得方法
お礼  Satsuki  - 15/2/9(月) 15:49 -

引用なし
パスワード
   ichinose 様

お返事が遅くなり、大変申し訳ありません。

>MsgBox Split(objIE.document.getElementById("price").innerText, vbCrLf)(1)
↑の方法を使わせて頂きましたところ、上手く行きました。

>MsgBox objIE.document.getElementsByTagName("br")(1).getAdjacentText("BeforeBegin")
getAdjacentTextという方法もあるのですね。1つ目の方法が使えない時に、活用できそうですね。
大変勉強になりました。
ありがとうございました。

またわからないことがありましたら、よろしくお願いいたします。
・ツリー全体表示

【76607】Re:画像の移動
お礼  vbaビギナー  - 15/2/9(月) 8:37 -

引用なし
パスワード
   ▼マナ さん:
回答ありがとうございます。
返信が遅れてしまい申し訳ありませんでした。
これを参考にして、試行錯誤していこうと思います。
・ツリー全体表示

【76606】Re:画像の移動
お礼  vbaビギナー  - 15/2/9(月) 8:33 -

引用なし
パスワード
   ▼β さん:
回答ありがとうございます。
返信が遅れてしまい、申し訳ありません。
さっそく試してみたいと思います。
・ツリー全体表示

【76605】Re:画像の移動
発言  マナ  - 15/2/7(土) 17:34 -

引用なし
パスワード
   画像名の入力をリストから選択するようにしました
入力値削除で、元の位置に戻せるようにしました

Option Explicit

Const myAdr As String = "A1:A10"


Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range
  Dim p As Picture
  Dim s As String
  Dim c As Range
  Dim v
 
  Set r = Range(myAdr)

  If Intersect(Target, r) Is Nothing Then Exit Sub
  If Target.Count <> 1 Then Exit Sub
'
  On Error Resume Next
  Set p = Pictures(Target.Value)
  On Error GoTo 0
 
  If Target.Value <> "" Then
    If p Is Nothing Then
      MsgBox "その名前の画像はありません"
      Application.EnableEvents = False
      Application.Undo
      Application.EnableEvents = True
      Exit Sub
    End If
  End If
  
  Application.EnableEvents = False
  For Each c In r
    s = c.NoteText
    If s <> "" Then
      v = Split(s, ",")
      With Pictures(v(0))
        .Top = v(1)
        .Left = v(2)
      End With
    End If
    If c.Address <> Target.Address Then
      c.ClearComments
      c.ClearContents
    End If
  Next
  Application.EnableEvents = True
  
  If Target.Value = "" Then
    Target.ClearComments
    Exit Sub
  End If
  
  Target.NoteText p.Name & "," & p.Top & "," & p.Left
  p.Top = Target.Top
  p.Left = Target.Width

End Sub


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim r As Range
  Dim p As Picture
  Dim myList

  Set r = Range(myAdr)

  If Intersect(Target, r) Is Nothing Then Exit Sub
  If Target.Count <> 1 Then Exit Sub

  For Each p In Pictures
    myList = myList & "," & p.Name
  Next

  With r.Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=myList
    .ShowError = False
    .IgnoreBlank = True
  End With
  
End Sub
・ツリー全体表示

【76604】Re:画像の移動
発言  マナ  - 15/2/7(土) 13:54 -

引用なし
パスワード
   私も考えてみました。
元位置は、セルのコメントに記録するようにしています。
予め、画像には名前をつけておいてください。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range
  Dim p As Picture
  Dim s As String
  Dim c As Range
  Dim v
 
  Set r = Range("A1:A10")

  If Intersect(Target, r) Is Nothing Then Exit Sub
  If Target.Count <> 1 Then Exit Sub
  
  On Error Resume Next
  Set p = Pictures(Target.Value)
  On Error GoTo 0
  
  If p Is Nothing Then
    MsgBox "その名前の画像はありません"
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
    Exit Sub
  End If
  
  Application.EnableEvents = False
  For Each c In r
    s = c.NoteText
    If s <> "" Then
      v = Split(s, ",")
      With Shapes(v(0))
        .Top = v(1)
        .Left = v(2)
      End With
    End If
    If c.Address <> Target.Address Then
      c.ClearComments
      c.ClearContents
    End If
  Next
  Application.EnableEvents = True
  
  Target.NoteText p.Name & "," & p.Top & "," & p.Left
  p.Top = Target.Top
  p.Left = Target.Width

End Sub
・ツリー全体表示

【76603】Re:画像の移動
発言  β  - 15/2/6(金) 20:45 -

引用なし
パスワード
   ▼vbaビギナー さん:

こんばんは

運用保守を考えると、↑でアップした方法より以下がいいかと思い直しました。
隠しシート(非表示でもOK)を用意し、そこに【元の図の位置】を格納しておきます。

1.各図をしかるべき【元の位置】に配置した状態で、StoreOriginal を実行してください。
  これは、元の図の位置を変更したら、その時にも実行してください。
2.シート上の操作は従来と同じです。

コードは、逆にシートモジュール一本にしました。
標準モジュールやThisWOrkbookモジュールのコードは消去してください。
なお、隠しシート名を仮に "SHeet2" にしてあります。

いずれかの図がA列のそばに移動している状態で保存しますと、次回、開いた際にも
移動したままで表示されますが、他の図を選ぶと、元の位置にもどります。

(シートモジュール)

Option Explicit

Const SHN As String = "Sheet2"   '隠しシート名

Private Sub Worksheet_Change(ByVal Target As Range)

  If Intersect(Target, Range("A1:A10")) Is Nothing Then Exit Sub
  If Target.Count <> 1 Then Exit Sub
  
  ResetOriginal
  
  Select Case Target.Value
    Case "みかん"
      Shapes(1).top = Target.top
      Shapes(1).left = Target.Width
    Case "りんご"
      Shapes(2).top = Target.top
      Shapes(2).left = Target.Width
    Case "さかな"
      Shapes(3).top = Target.top
      Shapes(3).left = Target.Width
    Case "牛乳"
      Shapes(4).top = Target.top
      Shapes(4).left = Target.Width
        Case "こおり"
      Shapes(5).top = Target.top
      Shapes(5).left = Target.Width
  End Select
End Sub

Sub StoreOriginal()
  With Sheets(SHN)
    .Range("A1").Value = Shapes(1).left
    .Range("A2").Value = Shapes(1).top
    .Range("A3").Value = Shapes(2).left
    .Range("A4").Value = Shapes(2).top
    .Range("A5").Value = Shapes(3).left
    .Range("A6").Value = Shapes(3).top
    .Range("A7").Value = Shapes(4).left
    .Range("A8").Value = Shapes(4).top
    .Range("A9").Value = Shapes(5).left
    .Range("A10").Value = Shapes(5).top
  End With
End Sub

Sub ResetOriginal()
  With Sheets(SHN)
    Shapes(1).left = .Range("A1").Value
    Shapes(1).top = .Range("A2").Value
    Shapes(2).left = .Range("A3").Value
    Shapes(2).top = .Range("A4").Value
    Shapes(3).left = .Range("A5").Value
    Shapes(3).top = .Range("A6").Value
    Shapes(4).left = .Range("A7").Value
    Shapes(4).top = .Range("A8").Value
    Shapes(5).left = .Range("A9").Value
    Shapes(5).top = .Range("A10").Value
  End With
End Sub
・ツリー全体表示

【76602】Re:画像の移動
発言  β  - 15/2/6(金) 19:49 -

引用なし
パスワード
   ▼vbaビギナー さん:

こんばんは

まず、元の位置に戻すには、元の位置がどこだったかを認識しなければいけません。
以下は、ブックを開いたときに、元の位置を把握しておき、Changeイベントで参照します。
なお、A列の横に移動している図をそのままにしてブックを保存すると、次回、ブックを開いたときに
元の位置がわからなくなるので、保存前に強制的に元の位置に戻します。

ThisWorkBookモジュールを使いますので、いっそのこと、ChangeイベントもThisWorkbookモジュールに
移します。(シートモジュールのままでもいいのですが、以下の例は、Changeイベントも移すコードです)

まず、シートモジュールのコードを消去してください。

(ThisWorkbookモジュール)

Private Sub Workbook_Open()
  StoreOriginal
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  ResetOriginal
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  If Sh.Name <> SHN Then Exit Sub
  If Intersect(Target, Sh.Range("A1:A10")) Is Nothing Then Exit Sub
  If Target.Count <> 1 Then Exit Sub
  
  ResetOriginal
  
  Select Case Target.Value
    Case "みかん"
      Sh.Shapes(1).top = Target.top
      Sh.Shapes(1).left = Target.Width
    Case "りんご"
      Sh.Shapes(2).top = Target.top
      Sh.Shapes(2).left = Target.Width
    Case "さかな"
      Sh.Shapes(3).top = Target.top
      Sh.Shapes(3).left = Target.Width
    Case "牛乳"
      Sh.Shapes(4).top = Target.top
      Sh.Shapes(4).left = Target.Width
    Case "こおり"
      Sh.Shapes(5).top = Target.top
      Sh.Shapes(5).left = Target.Width
  End Select

End Sub

(標準モジュール)

Option Explicit

Type pos
  left As Double
  top As Double
End Type

Public s1 As pos
Public s2 As pos
Public s3 As pos
Public s4 As pos
Public s5 As pos

Public Const SHN As String = "Sheet1"   '該当シート名

Sub StoreOriginal()
  With Sheets(SHN)
    s1.left = .Shapes(1).left
    s1.top = .Shapes(1).top
    s2.left = .Shapes(2).left
    s2.top = .Shapes(2).top
    s3.left = .Shapes(3).left
    s3.top = .Shapes(3).top
    s4.left = .Shapes(4).left
    s4.top = .Shapes(4).top
    s5.left = .Shapes(5).left
    s5.top = .Shapes(5).top
  End With
End Sub

Sub ResetOriginal()
  With Sheets(SHN)
    .Shapes(1).left = s1.left
    .Shapes(1).top = s1.top
    .Shapes(2).left = s2.left
    .Shapes(2).top = s2.top
    .Shapes(3).left = s3.left
    .Shapes(3).top = s3.top
    .Shapes(4).left = s4.left
    .Shapes(4).top = s4.top
    .Shapes(5).left = s5.left
    .Shapes(5).top = s5.top
  End With
End Sub
・ツリー全体表示

【76601】画像の移動
質問  vbaビギナー  - 15/2/6(金) 14:23 -

引用なし
パスワード
   初めて質問させて頂きます。

VBAを使用して社内業務の一部簡略化を図るべく
手探りで組んでみているのですがどうしても分からないので
どなたかお力添えお願いします。

こちらでやりたい事は特定の文字を入力すると、それに対応した画像を特定のシート上の
特定の座標(セルでも可)へ移動したいというものです。

いろいろなサイトを参考にし、自分なりに作ってみたものの、綺麗に収まらず困っています。
こちらが作成したコードです。


Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1:A10")) Is Nothing Then Exit Sub
If Target.Count <> 1 Then Exit Sub
Select Case Target.Value
Case "みかん"
Shapes(1).Top = Target.Top
Shapes(1).Left = Target.Width
Case "りんご"
Shapes(2).Top = Target.Top
Shapes(2).Left = Target.Width
Case "さかな"
Shapes(3).Top = Target.Top
Shapes(3).Left = Target.Width
Case "牛乳"
Shapes(4).Top = Target.Top
Shapes(4).Left = Target.Width
Case "こおり"
Shapes(5).Top = Target.Top
Shapes(5).Left = Target.Width
End Select
End Sub

この状態だと、画像が元の場所に戻らないため、画像が重なってしまうことがあります。
そこで画像は、入力されていない場合は元の場所に戻るように改良を加えたいのです。

このコードを使用しなくても構いません。
どなたかヒントを頂けませんか?
・ツリー全体表示

【76600】Re:入れ子の親タグのテキスト取得方法
発言  ichinose  - 15/2/3(火) 6:59 -

引用なし
パスワード
   ▼Satsuki さん:
提示されたデータからだと


>objIE.document.getElementById("price").innerText
>と記述すると、「2000yen(改行)1500yen(改行)500yen」とすべてのテキストが表示されてしまいます。ローカルウィンドウでもどのinnerTextも上記のようになっています。
>どのように記述したらいいでしょうか?
>どなたかご教示のほどお願いいたします。
>
><span class="kakaku" id="price">
><span class="kyukakaku">2000yen</span>
><br />1500yen<br/>
><span class="sagaku">500yen</span>
></span>

MsgBox Split(objIE.document.getElementById("price").innerText, vbCrLf)(1)

MsgBox objIE.document.getElementsByTagName("br")(1).getAdjacentText("BeforeBegin")


こんな方法がありそうですけど・・。
・ツリー全体表示

【76599】回答ありがとうございます。
お礼  もろ  - 15/2/2(月) 22:52 -

引用なし
パスワード
   ありがとうございます。参考にさせていただきます。
・ツリー全体表示

【76598】入れ子の親タグのテキスト取得方法
質問  Satsuki  - 15/2/2(月) 17:19 -

引用なし
パスワード
   こんにちは、Satsukiと申します。

下記のような入れ子構造のタグがあり、「1500yen」の部分のみを取得したいのですが、
objIE.document.getElementById("price").innerText
と記述すると、「2000yen(改行)1500yen(改行)500yen」とすべてのテキストが表示されてしまいます。ローカルウィンドウでもどのinnerTextも上記のようになっています。
どのように記述したらいいでしょうか?
どなたかご教示のほどお願いいたします。

<span class="kakaku" id="price">
<span class="kyukakaku">2000yen</span>
<br />1500yen<br/>
<span class="sagaku">500yen</span>
</span>
・ツリー全体表示

【76597】Re:日付
発言  β  - 15/2/1(日) 16:11 -

引用なし
パスワード
   ▼もろ さん:
>ある日にちがきたら、プログラムを実行したい場合はどうすれば良いでしょうか。プログラムの内容自体は簡単です。

当方、実際にやってはいないので情報のみ。
Windowsのタスクスケジューラに登録することになるんでしょうね。

ht p://www.atmarkit.co.jp/ait/articles/1305/31/news049.html

「毎日決まった時間にエクセルブックを開く」で検索すると、
以下のような具体的な説明ページがたくさん出てきます。

ht p://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10134711260
ht p://plaza.rakuten.co.jp/mscrtf/diary/201207090000/
・ツリー全体表示

【76596】日付
質問  もろ  - 15/2/1(日) 15:27 -

引用なし
パスワード
   ある日にちがきたら、プログラムを実行したい場合はどうすれば良いでしょうか。プログラムの内容自体は簡単です。
・ツリー全体表示

【76595】Re:コンパクト化
お礼  こずえ  - 15/1/24(土) 23:28 -

引用なし
パスワード
   βさん

原因が分かってスッキリしました。

ご丁寧な説明有難うございました。
これからも、このサイトで勉強させていただきます。

有難うございました
・ツリー全体表示

【76594】Re:コンパクト化
発言  β  - 15/1/24(土) 10:47 -

引用なし
パスワード
   ▼こずえ さん:

おはようございます。

「1〜2秒ほど関係のないところ・・・」というのが、処理に1〜2秒ほどかかり
メニューシートのC10〜G10に本来セットされる条件じゃないところに
【印刷】という文字が入ったということならわかりました。
(1〜2秒ほどの間、印刷が繰り返されたということなら、もう少し情報が必要ですが)

イベント処理の最初に kanabun さんのコードでは

If Target.Column <> 3 Then Exit Sub 'C列の Change でなければ抜ける

私のコードでは

Set r = Range("C13:C14,C64:C65,C115:C116,C166:C167,C219:C220,C248:C249,C277:C278,C306:C307")
If Intersect(Target, r) Is Nothing Then Exit Sub

こういうところがありますね。

kanabunさんのコードの意味は、コメントにもあるように変更され、ここにとんできたときの
Target(変更領域のアドレス)がC列でなければ処理しないで抜けます。

私のコードでは、その領域が、Set r = ・・・で指定したセル領域以外なら抜けます。

一方、こずえさんのコードは、シート上のどこが変更されても実行されます。

で、このSub 印_エネ_簡易書留_小() 、お気づきかどうか、変更が3回行われています。

.Offset(.Rows.Count).Resize(2).EntireRow.Insert

.Offset(.Rows.Count + 2).Resize(2).EntireRow.Insert

.Offset(.Rows.Count).Resize(.Rows.Count + 2).EntireRow.Delete

その変更時の、Target はすべて行単位、たとえば 最初のコードなら

$239:$240 というものです。

Target.Column は、この場合、1。また私のコードで規定したセル群は、この$239:$240には
はいっていませんので、処理せず抜けます。

こずえさんのコードは、3か所の変更が起こる都度、イベントプロシジャが実行され
【その時の】セル位置に対して判断が行われ【その時の】C10〜G10の場所に値が入ります。

こういった現象をイベントの連鎖といって、もし、コード実行で、こういうことがありうるなら
それを回避する手立てをいれる必要があります。
kanabunさんのコードや私のコードは、【たまたま】処理が必要だというチェックをしている場所が
変更のあった場所に【ひっかからなかっただけ】で、本来は、イベントそのものを発生させないように
することが必要なんです。

イベントは

Application.EnableEvents = False

これで発生がとまりますので、印_エネ_簡易書留_小()の最初 With句の下あたりに
に、このコードを記述しましょう。
で、このままでは、永久にイベントが発生しなくなりますので、End WIth の前に
Application.EnableEvents = True と記述してください。

kanabunさんや私のコードをお使いになる場合でも、【たまたま】セーフということですから
必ず、このApplication.EnableEvents = False/True の手当てをしておいてくださいね。
・ツリー全体表示

291 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free