Excel VBA質問箱 IV

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

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


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

【78225】下一桁を1あげるマクロ
質問  えり  - 16/5/31(火) 16:57 -

引用なし
パスワード
   001254
004526
009503
   ・
   ・
   ・
  続く

このように1つの列に数字が並んでいる
全てのセルは「文字列になってれいる

数字の下1桁に➕1するしたい
001255
004527
009504
どのようなマクロを組めば良いでしょうか。
ご教授下さい。
・ツリー全体表示

【78224】Re:プリントスクリーンを貼り付ける方法
お礼  へいへい  - 16/5/29(日) 22:46 -

引用なし
パスワード
   白紙になることなくペーストできました。ありがとうございます。スリープを使えばよかったんですね。すばらしい
・ツリー全体表示

【78223】Re:プリントスクリーンを貼り付ける方法
回答  γ  - 16/5/29(日) 20:16 -

引用なし
パスワード
   '    Do While .Busy = True
'      DoEvents
'    Loop
に代えて
    
    Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE
       DoEvents
    Loop
    Sleep 1000
などとしてみては。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
も最初に追加してください。
・ツリー全体表示

【78222】プリントスクリーンを貼り付ける方法
質問  へいへい  - 16/5/29(日) 13:02 -

引用なし
パスワード
   ご教授お願いします。

ホームページをプリントスクリーンでコピーして、エクセルに張り付けるようにしたいのですが、以下では綺麗にコピーできる時と、白紙でコピーされる場合(おそらくコピーする段階で画面が開ききっていないことが原因)があり、使いものになりません。どうすれば、良いでしょうか?例えば、ホームページを立ち上げが完了したらコピー動作に移るようにしたいのですが。

Option Explicit
Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
  bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Declare Function GetVersionExA Lib "kernel32" _
   (lpVersionInformation As OSVERSIONINFO) As Integer
Public Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
End Type
Public Const KEYEVENTF_KEYUP = &H2
Public Const VK_SNAPSHOT = &H2C
Public Const VK_MENU = &H12
'==============================================================
Sub test()


  Dim blnAboveVer4 As Boolean
  Dim osinfo As OSVERSIONINFO
  Dim retvalue As Integer
  osinfo.dwOSVersionInfoSize = 148
  osinfo.szCSDVersion = Space$(128)
  retvalue = GetVersionExA(osinfo)
  
  If osinfo.dwMajorVersion > 4 Then blnAboveVer4 = True
  With CreateObject("InternetExplorer.Application")
  

    .Visible = True
    .Navigate "HTTPS:///・・・・・・・・"
    Do While .busy = True
     DoEvents
     Loop
    If blnAboveVer4 Then
     keybd_event VK_SNAPSHOT, 1, 0, 0
    Else
     keybd_event VK_MENU, 0, 0, 0
     keybd_event VK_SNAPSHOT, 0, 0, 0
     keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0
     keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
     End If
    DoEvents
    .Quit
    End With
  With ActiveSheet
    Range("A1").Activate
    .Paste
    End With
End Sub
・ツリー全体表示

【78221】Re:WorksheetFunction
回答  γ  - 16/5/28(土) 5:50 -

引用なし
パスワード
   Range(Cells(3, 3), Cells(3, 13))

Range("B3:B13")の代替と考えているなら、
単純ミスです。
Cells(行,列)ですから。

まあ、先のコメントは決して無駄にはならないと思う。
理解して使えるようにしておくと良いと思う。
・ツリー全体表示

【78220】Re:WorksheetFunction
回答  γ  - 16/5/28(土) 5:01 -

引用なし
パスワード
   (1)まず入力3は、Range(Cells(15,3))の部分が間違い。
こういう書き方はありません。単に、Cells(15,3)でしょう。

(2)入力2 は、実際にマッチするものがないのでしょう。

こうした場合、WorksheetFunction.Matchでは実行時エラーが発生します。
エラー処理が必要となります。
詳細は、例えば↓の記事を参考にしてください。
ht tps://www.moug.net/tech/exvba/0100004.html

別の方法として、Application.Matchを使う方法があります。
この場合は実行時エラーにはならず、IsErrorだけで判定できるので、
どちらかといえば、こちらのほうが記述は容易になります。
詳細は、例えば↓の記事を参考にしてください。
ht tps://www.moug.net/tech/exvba/0100035.html
・ツリー全体表示

【78219】WorksheetFunction
質問  TODD  - 16/5/27(金) 22:34 -

引用なし
パスワード
   お世話になりますあ。
WorksheetFunctionについてご質問させて下さい。

入力1では、msgboxに数値が返されますが、入力2・入力3ではエラーとなります。
WorksheetFunctionのMatchでは、入力2・入力3ようにCellsは使用できないのでしょうか?

入力1
Dim matchFig As Integer
matchFig = WorksheetFunction.Match(Range("C15"), Range("B3:B13"), 0)
MsgBox matchFig
→動作する

入力2
matchFig = WorksheetFunction.Match(Range("C15"), Range(Cells(3, 3), Cells(3, 13)), 0)
→動作しない

入力3
Dim matchFig As Integer
matchFig = WorksheetFunction.Match(Range(cells(15,3)), Range("B3:B13"), 0)
MsgBox matchFi
→動作しない

ご確認宜しくお願い致します。

以上
・ツリー全体表示

【78218】Re:実行時エラー13 型が一致しません
発言  助けて  - 16/5/27(金) 17:47 -

引用なし
パスワード
   すいません。。。
エラーの発生源がわかり自己解決しました。。。(エラー発生源が予想と違かった)

しかし別の問題が発生しました!
vlookup関数を冒頭のセルにコピーして処理領域のある行のセルすべてに貼り付けてるんですけども、
相対参照されないで、出てくるのですが
セルの中身をいざみると相対参照されていて、1回セルのデータを選択してエンターを押すと相対参照になります。
どういったことが原因なのでしょうか。
・ツリー全体表示

【78217】Re:実行時エラー13 型が一致しません
発言  独覚  - 16/5/27(金) 14:28 -

引用なし
パスワード
   ▼助けて さん:

回答ではないけれども。

VBエディタの「ツール」-「オプション」で「全般」タブの「エラートラップ」を
「エラー発生時に中断」にした場合もエラー発生個所は同じでしょうか?


なお、確認後はエラートラップのチェック箇所をもとに戻しておいてください。
・ツリー全体表示

【78216】Re:実行時エラー13 型が一致しません
発言  助けて  - 16/5/27(金) 12:03 -

引用なし
パスワード
   実行時エラー '13':
型が一致しません

と出ます。
・ツリー全体表示

【78215】Re:実行時エラー13 型が一致しません
発言  助けて  - 16/5/27(金) 11:48 -

引用なし
パスワード
   ありがとうございます。

Next iでループは回ることは確認しております。
しかし、iに関するループが回った後、エラーが表示されます。


処理領域の次の行のセルに書き込むのは合ってます。
・ツリー全体表示

【78214】Re:実行時エラー13 型が一致しません
発言  β  - 16/5/27(金) 11:43 -

引用なし
パスワード
   ▼助けて さん:

コードは詳細に読んでいないのですが、エラーが発生するコードは

Next i

ですか?

それとも他のコードですか?
他のコードだとすると、どれはどのコードですか?

で、その時のエラー番号とエラーメッセージの内容を
正確にアップしてください。

ちなみに、要件はわかりませんけど、ループを抜けた後の処理、

    If number = 0 Then
      Cells(j, i).Value = 0
    Else
      MsgBox score / number
      Cells(j, i).Value = score / number
    End If

ここで相手にしている i や j は、処理領域の最後の行の次の行、
処理領域の最後の列の次の列ですけど、それはいいのですね?
・ツリー全体表示

【78213】実行時エラー13 型が一致しません
質問  助けて  - 16/5/27(金) 11:22 -

引用なし
パスワード
   お世話になります。

下記のマクロを作ったのですが、コメントアウトしたところでエラーが発生してしまいます。
しかもiに関してのForループが回った後です。なぜかわかりますか??


Sub ネガポジ()

Dim i As Integer ' 変数
Dim score As Double
Dim number As Double
Dim j As Integer
Dim m As Integer
Dim s As Integer
score = 0
number = 0


i = 2


Rows(2).Insert ' 行を挿入
Rows(3).Insert
Do While Cells(1, i) <> ""
  Cells(2, i) = StrConv(Cells(1, i), vbKatakana) '単語をカタカナに変換
  Cells(3, i) = StrConv(Cells(1, i), vbHiragana) ' 単語を平仮名に変換
  i = i + 1
 
  Loop
i = 3
Rows(6).Insert
Rows(7).Insert
Rows(8).Insert
Cells(6, 2).Value = "=VLOOKUP(B1,データベース!$A$1:$D$60000,4,False)" ' スコアの表示
Cells(7, 2).Value = "=VLOOKUP(B2,データベース!$B$1:$D$60000,3,False)"
Cells(8, 2).Value = "=VLOOKUP(B3,データベース!$B$1:$D$60000,3,False)"
Do While Cells(1, i) <> ""
 Cells(6, i - 1).Copy Cells(6, i)
  Cells(7, i - 1).Copy Cells(7, i)
  Cells(8, i - 1).Copy Cells(8, i)
  i = i + 1
 Loop
  m = Cells(Rows.Count, "A").End(xlUp).Row
  s = Cells(9, Columns.Count).End(xlToLeft).Column
For j = 9 To m
score = 0
number = 0
For i = 2 To s
 If Cells(j, i).Value > 0 Then
  If Application.WorksheetFunction.IsError(Cells(6, i)) = False Then
    score = score + Cells(6, i).Value * Cells(j, i).Value
    number = number + Cells(j, i).Value
  ElseIf Application.WorksheetFunction.IsError(Cells(7, i)) = False Then
       score = score + Cells(7, i).Value * Cells(j, i).Value
       number = number + Cells(j, i).Value
  ElseIf Application.WorksheetFunction.IsError(Cells(8, i)) = False Then
       score = score + Cells(8, i).Value * Cells(j, i).Value
       number = number + Cells(j, i).Value
    Else
    End If
    End If
    Next i  'なぜかForループが終わったときにエラーを吐く。
    If number = 0 Then
      Cells(j, i).Value = 0
    Else
    MsgBox score / number
    Cells(j, i).Value = score / number
    End If
    Next j
    
  Cells(9, i - 1).Copy
  Cells(9, i).PasteSpecial
  Cells(9, i - 1).Value = ""
  Cells(8, i).Value = "ネガポジ分析結果"


End Sub
・ツリー全体表示

【78212】Re:セルの範囲を1行に羅列させる
お礼  倒ビン対策  - 16/5/26(木) 15:39 -

引用なし
パスワード
   早速ご回答有難うございます。
小文字のlは消し忘れが一つありました。
そしてjとiは入れ替えてズバリ正解で本当に助かりました。
有難うございます。
・ツリー全体表示

【78211】Re:セルの範囲を1行に羅列させる
発言  独覚  - 16/5/26(木) 13:25 -

引用なし
パスワード
   ▼倒ビン対策 さん:
Withtを指定しているのにその後使っていないとか
>l = 0
この「l」(Lの小文字)って「i」の間違い?
とかインデントがむちゃくちゃとかは置いといて。

エラーの原因は
>.Cells(DSLastRow + 1, m).Value = SaleAry(j, i)
のjとiが逆では?

あるいは
>For j = 1 To b
>  For i = 1 To a
のaとbが逆か。
・ツリー全体表示

【78210】セルの範囲を1行に羅列させる
質問  倒ビン対策  - 16/5/26(木) 11:54 -

引用なし
パスワード
   御世話になります。
特定のフォルダー内にあるファイルの決まった範囲を配列で取り込んで
別ファイルに1行で横へ追記していく動きをさせたく、色々なコードを
参考に作成しましたが、添字mの値が65で【実行時エラー9 インデックスが
有効範囲にありません】と表示され止ってしまいます。
あれこれ1日半ぐらい考えましたが解決する力量が無く
ご助言など頂けますようお願い致します。


Sub 新規レコード転記2()
  Dim SaleAry As Variant
  Dim i As Integer
  Dim j As Integer
  Dim m As Integer
  Dim a As Integer
  Dim b As Integer

Dim SULastRow As Long
Dim DSLastRow As Long
Dim FolderName As String
Dim FileNeme As String

ダイアログ表示:

FolderName = フォルダーダイアログ()

FileNeme = Dir(FolderName & "\*.xls", vbNormal)
 
 If FileNeme = "" Then
  MsgBox "EXCEL ブックがありません"
  
   GoTo ダイアログ表示
   
   End If
   
   Do While FileNeme <> ""
  
   Workbooks.Open (FolderName & "\" & FileNeme)
    With Worksheets(1)
      
  SaleAry = Range("A7:I14").Value
  
    End With
   
  l = 0
  m = 0

  a = UBound(SaleAry)
  b = UBound(SaleAry, 2)
  
  
   With ThisWorkbook.Worksheets("殺菌条件")
  
   DSLastRow = ThisWorkbook.Worksheets("殺菌条件").Range("B65536").End(xlUp).Row
   
     For j = 1 To b
              For i = 1 To a
    
        m = m + 1
       
   .Cells(DSLastRow + 1, m).Value = SaleAry(j, i)

               Next i
         i = 1
     Next j
   
   Set SaleAry = Nothing
  
   
   End With
    
   ActiveWorkbook.Close
   
   FileNeme = Dir()
   
   Loop
   
   ThisWorkbook.Worksheets("殺菌条件").Activate
   
   End Sub
・ツリー全体表示

【78209】Re:エクセル内のデータ転送に関して
質問  TODD  - 16/5/26(木) 10:29 -

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

内容が理解出来ました。
有難うございます。

以上
・ツリー全体表示

【78208】Re:このマクロを1つにまとめたいんですが
お礼  [名前なし]  - 16/5/26(木) 10:10 -

引用なし
パスワード
   説明と回答ありがとうございました。
無事マクロができました。
・ツリー全体表示

【78207】Re:エクセル内のデータ転送に関して
発言  β  - 16/5/26(木) 8:03 -

引用なし
パスワード
   ▼TODD さん:

あたらずといえども遠からず?

たとえば 今、 I1:K20 の領域を対象にした処理だとします。

そうすると

With Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3)

これは

With Range("I1:K20") ということになります。

この With で指し示した領域は、その領域が、クリアされようと、何か値が入ろうと
End With まで、動きません。

したがって、.Value = .Value は Range("I1:K20").Value = Range("I1:K20").Value
つまり、その領域全体を値変換しますので、その中の数式部分も値に置き換わるということです。
本来は、式をセットした領域の変換でいいわけですが、面倒なので、式ではなく値が入っている
領域も処理。値が値になるだけで問題はないので。
・ツリー全体表示

【78206】Re:エクセル内のデータ転送に関して
お礼  TODD  - 16/5/26(木) 4:29 -

引用なし
パスワード
   β様

ご説明して頂いた内容により、ほぼ内容を理解することが出来ました。
有難うございます!!


With Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3)
adr1 = .Cells(1).Address(False, True)
.Columns("B:C").Formula = "=IFERROR(VLOOKUP(" & adr1 & "," & adr0 & ",COLUMN(B1),FALSE),""登録なし"")"

------------------------------------------------------------------------
下記最後の行ですが、
.Value = .Value

これは下記内容になると思います。
Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3).Value
= Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3).Value

この行の導入されていなければ、エクセルの対象セルに
IFERROR(VLOOKUP($I5,$A$1:$C$12,COLUMN(C5),FALSE),"登録なし")の式が
記載され、行が導入されると式が記載されません。

I1:K20までのセルにデータを転送した後になるので、
K1:M20までの範囲の値 = K1:M20までの範囲の値となると思います(つまり空欄)。
これがなぜ、式の記載有り、記載無しに影響を与えるのでしょうか?

何度も申し訳御座いません。

以上
・ツリー全体表示

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