エクセルVBAで自分以外のファイルの値7を参照する方法

このQ&Aのポイント
  • エクセルVBAを使用して、自分以外のファイルの値7を参照する方法を教えてください。
  • Sheet1のA1~B4にフォルダ名、ファイル名、レンジを入力し、Sheet1のC5からその範囲を表示させたいです。
  • オフセットを使用して範囲を設定しているが、入力欄が上書きされてしまう問題が発生しています。どのように回避すればよいでしょうか?
回答を見る
  • ベストアンサー

エクセル VBA オフセットさせたいのですが。

エクセル VBAでの質問です。 自分以外のファイルの値7を参照するエクセルを作っています。 sheet1のA1~B4に入力欄があり、 そこにフォルダ名、ファイル名、レンジを入力し、sheet1に表示しようと思っています。 しかし、A1~B4までの範囲を設定してしまうと、入力欄が上書きされてしまいます。 それを回避するためにオフセットさせようと思い、 自分で色々やってみたのですが、うまくいかないので教えてください。 要望としては、Sheet1B4にA1:F10と入力されてた場合、 Sheet1のC5からその範囲を表示させたいです。 以下が詳細です。 ーーーーー Sheet1 (B1)フォルダ名入力欄 例 C:\test\test2 (B2)空白 「コマンドボタン1」あり (B3)20110101.xls (B4)B5:D8 -------- ’コード Private Sub Commandbutton1_Click() Dim hani As Variant hani = Range("B4").Value Range(hani) = "='" & Range("B1").Value & "\[" & Range("B3").value & "]Sheet1'!" & Range("B4").Value’↑改行なしです。 End Sub -------- です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

参照式を入れる基点(左上セル)はC5セル固定でいいんですね。 基本形は RANGE("C5:E8").Formula = "=パス[ブック名.xls]シート名!B5" のようにします。 左側が「目的の範囲の縦横寸法に合致した,C5を基点とするセル範囲」であり,逆に右側は「目的(参照元)の範囲の左上のセル1個を相対参照で参照する式」にするという原則を憶えてください。 あとは実地に合わせてのバリエーションです。 dim hani as string dim s as string hani = range("B4").value s = split(hani,":")(0) range("C5").resize(range(hani).rows.count, range(hani).columns.count).formula _ = "='" & range("B1") & "\[" & range("B3") & "]Sheet1'!" & s

KashiMAX
質問者

お礼

皆さんの回答全部問題なくてbaまよったのですが、 1番シンプルなこれにしました

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

アイデアとしては面白いけれども、マクロらしくないマクロです。 例えば、以下のようになります。 Private Sub Commandbutton1_Click()  Dim hani As Variant  Dim rng As Range  Dim m As Long, n As Long  Dim i As Long, j As Long  hani = Range("B4").Value  Set rng = Range(hani)  m = rng.Rows.Count: n = rng.Columns.Count  For i = 1 To m   For j = 1 To n    Range("C5").Cells(i, j).Formula = "='" & Range("B1").Value & "\[" & Range("B3").Value & "]Sheet1'!" & Range(hani).Cells(i, j).Address(1, 1)   Next j  Next i End Sub しかし、私なら、エラー処理を行うようにして、このように書くかもしれません。 ただ、ファイルを開かないで値を取るというのは、イレギュラーなマクロであることには違いありません。ブックをオーブンして、値を取るのが基本です。

KashiMAX
質問者

お礼

回答ありがとうございます 今勉強中なので非常に参考になります 表示結果は問題ありませんでした

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

シートの指定はどうなったのかな。指定しないのかな。 下記ではSheet1に仮定。 ーー 下記は質問者のやり方と違ったやり方である。 どちらが普通のやり方かよく判らない。こちらも慣れない者には難しいと思う。 しかし、よく初心者が、ブックをオープンしないでとか勝手なことを質問するのがあるが、そういうのに対しては、下記は応えてない。 ーー C:\Documents and Settings\XXXX\My Documents (コマンドボタン貼り付け位置) 01BBB.xls コピー元ブック名 A1:B5    コピー元セル範囲 ーーー コード Private Sub CommandButton1_Click() Application.ScreenUpdating = False Dim wb1 As Workbook Dim wb2 As Workbook Dim rng As String Set wb2 = ActiveWorkbook rng = wb2.Worksheets("Sheet1").Range("b4") Set wb1 = Workbooks.Open(Range("b1") & "\" & Range("b3")) wb1.Worksheets("sheet1").Range(rng).Copy wb2.Worksheets("Sheet1").Range("A20") wb2.Worksheets("Sheet1").Activate Application.ScreenUpdating = True End Sub ーー コピー元のブックのSheet1のrange(”A1;B5”)をコピーして、今開いている(このコードを入れている)ブックの Sheet1のA25セルから貼り付けている。 このA25を右上隅のセルとして、任意に指定すれば、好みの位置に貼り付けられる。

KashiMAX
質問者

お礼

初心者な質問ですみませんでしたσ(^_^;) 最終的な表示結果はもんだいありませんでした 回答ありがとうございます! 勉強させてもらいます

関連するQ&A

  • EXCEL 名前の定義 VBA参照の方法

    EXCELの名前の定義を、VBAから参照する方法を教えていただきたいのですが  名前を定義する    シートA  名前:TEST 範囲:シートA    シートB  名前:TEST 範囲:シートB    シートC  名前:Pass 範囲:ブック  それぞれをVBAから参照する場合    Range("TEST").Value: シートA内のVBA    Range("Pass").Value  では、参照できず。    Worksheets("シートA").Range("TEST").Value    Worksheets("シートC").Range("Pass").Value  にて、参照できました。 明示的なシート名入力が必要なのでしょうか? よろしくお願いいたします。

  • エクセルのフォームのVBAについて

    VBAがまったくわからないのに参考書を見て高度な事に挑戦しています フォームは作れてフォームをクリックやら入力やらして作ったOKボタンを押すと シート2のA1B1C1‥の列に入力文字だけが羅列されます。 しかし次にやろうとするとA2B2C2‥と下に行かず又A1B1C1‥の列の文字が変更になり続きません。何がいけないのでしょうか? Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row .Range("A" & LastRow).Value = Worksheets("sheet1").Range("A5").Value .Range("B" & LastRow).Value = Worksheets("sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("A10").Value End With End Sub と参考書とおりいれたのですが‥。教えて下さい。

  • エクセル VBA

    A1,A2,A3→RAND()*99+1 B1→MAX(A1:A3) Sub test() Worksheets("sheet1").Calculate Dim x As Integer x = Range("B1") Range("C1").Value = x End Sub このように記述すると、B2とC2で結果が変わってしまうのですが、どうしてでしょうか?結果を同じにするにはどうすればいいですか?

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • VBAにおけるセルの名前の参照方法

    現在、Aシート、Bシートがあり、BシートのA1セルに test という名前を付けました。(範囲はブック) Aシートが再計算されれば、BシートのA1セルをメッセージボックスで表示したいのですが、調べましたが、よくわかりませんでしたので、詳しい方教えてください。 範囲はブックになっているし、他に同じセルの名前もつけれないようになっているので、 このような記述で大丈夫かと思いましたがエラーが出でしまいました。 なぜでしょうか?やはりわざわざ毎回シート名から記述が必要なのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range)      MsgBox (Range("test").Value) End Sub このようにシート名から書けば表示されました。 Private Sub Worksheet_Change(ByVal Target As Range)      MsgBox (Worksheets("B").Range("test").Value) End Sub

  • VBA(エクセル)について

    エクセルのマクロに関しては初心者です。 勤務予定表を作っています。 別のシートで月間勤務予定表は完成しています。 (縦に従業員名、横に日付) 別のシートで日付を指定すれば、その日の勤務予定状況を時系列で表示させるようにしたいのですが・・・ 例えば、 20日 AさんはA勤8:30~17:30、 BさんはB勤13:00~19:00、21:00~24:30 (このほかに勤務形態は4種類あります。) の勤務なら縦に従業員名、横に時系列にして、■などでその時系列上で表示させたいですが、 VBAを利用して日にちを指定して、ボタンひとつで全従業員分を表示させることは可能なのでしょうか? わかりづらい質問で大変申し訳ないのですが、よろしくお願いします。 ちなみに素人知恵で以下のように書いたのですが、まったく動きませんでした。 Sub test() Select Case b3 Case "早番" Range("c3:g3").Value = "■" Range("k3:n3").Value = "■" Case "遅番" Range("g3:k3").Value = "■" Range("m3:n3").Value = "■" Case "CA勤" Range("c3:d3").Value = "■" Range("j3:k3").Value = "■" Case "CB勤" Range("i3:k3").Value = "■" Range("m3").Value = "■" Case Else End Select End Sub

  • エクセルVBA抽出がうまく出来ません

    エクセル2013VBA初心者です。 入力シートからDBシートへ、DBシートから印刷シートへのデータ転記と印刷、入力内容のクリアまでは出来るようになりました。 DBシートの検索を行い、記録内容を入力シートに転記する抽出を行いたいのですが、下記構文を書いたところで問題が発生しました。 If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then  でとまります。メッセージは ‘Range’メソッドは失敗しました:‘Workshieet’オブジェクトというものです。 やろうとしていることは、入力シートに設けた“E12”と”G12”の二つの検索項目をキーにDBシートの行を特定し、この行の内容を入力シートに反映しようということです。 入力シートの検索項目“E12”、 ”G12”はそれぞれDBシートのA列、B列に格納されている項目で、年度と連番です。サンプルとして入力シート"C5"に抽出しようとしているDBシートD列は申請者名です。 恐れ入りますがよろしくご教示頂きたく、お願い申し上げます。 Sub DBシートから力情報を抽出する () Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim i As Long Dim j As Long Dim k As Long Set Sh1 = Worksheets("入力") Set Sh2 = Worksheets("DB") j = Sh1.Range("E12").Value k = Sh1.Range("G12").Value With Sh2 For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then Sh1.Range("C5").Value = Sh2.Range("D & i").Value End If Next  End With End Sub

  • エクセルVBAで数字の転記

    セルの数字の転記でTEST1のように繋がっているセル範囲は、その一つしたの値を一編に持ってこれます。 Sub TEST1() Range("C6:E6").Value = Range("C6:E6").Offset(1).Value End Sub ところがTEST2のように接してはいても繋がっていないとC15の一つ下の値がD14にも入ってしまいます。 Sub TEST2() Range("C15,D14").Value = Range("C15,D14").Offset(1).Value End Sub Range("C15,D14")あるいはRange("C15,E14")のようなとなりあっていない場合でも一個したの数値を一編に持ってくるような方法はないでしょうか?

  • excel vba sumif 月間集計

    excel vba sumif 月間集計 どなたか教えていただけますか? sheet1に1日毎のデータが打ち込まれています。そのデータを同じブック内の月間シートが開いたときに表示してるのですが、31日間分のコードをsumifで処理しているため、かなりのファイル容量となり重くなります。もっと効率的な方法はないのでしょうか、(範囲指定の繰り返し処理等)お願いいたします。 なお、sheet1からsheet5まで日毎のデータをそれぞれ月間シート1~5に集計してます。 例です。 sheet1は   A    B     C    D     E   F・・・・ 1 日  目的  距離  燃料 2 1   社用  50 3 1   私用  60   10  4 2   社用  30 月間シート1は   A   B   C   D E    F 1 日  距離  燃料       1110 2 1  110    10 3 2   30     0  Private Sub Worksheet_Activate() UserForm1.Hide Range("A1").Select '距離数 Range("B2").Value = WorksheetFunction.SumIf(Sheets("Sheet1").Range("A2:A300"),   Range("A2"), Sheets("Sheet1").Range("C2:C300"))   Range("B3").Value = WorksheetFunction.SumIf(Sheets("Sheet1").Range("A2:A300"),   Range("A3"), Sheets("Sheet1").Range("C2:C300"))      ・      ・      ・ '累計 ・・・は、こんな感じ処理してます Dim myRng As Range Dim c As Range Set myRng = Range("F2:F32") For Each c In myRng c.Value = c.Offset(0, -4).Value + c.Offset(-1, 0).Value  Next c  End Sub

  • エクセルVBAについて

    こんにちわ! 今、エクセルでAシートの入力した項目をBのシートへデーターが入力できるようなシステムを以下のようにくみました。 そこでBシートにデーターが入力されるのですが20行まで入力すると入力できないようにしたいのですが、なかなか上手くいきません。 A1からF20まで書式のロックを外しそれ以外のセルは保護をかけたのですがその状態でVBAを使って20行以上入力できませんという感じのエラー表示をしたいのですが、どうすればいいでしょうか? VBAは初心者ですが宜しくお願いします。 Private Sub CommandButton1_Click() Dim row As Integer row = WorksheetFunction.CountA(Sheets("date").Columns(1)) + 1 Sheets("date").Cells(row, 1).Value = Range("B2").Value row = WorksheetFunction.CountA(Sheets("date").Columns(2)) + 1 Sheets("date").Cells(row, 2).Value = Range("B3").Value row = WorksheetFunction.CountA(Sheets("date").Columns(3)) + 1 Sheets("date").Cells(row, 3).Value = Range("B4").Value row = WorksheetFunction.CountA(Sheets("date").Columns(4)) + 1 Sheets("date").Cells(row, 4).Value = Range("B5").Value row = WorksheetFunction.CountA(Sheets("date").Columns(5)) + 1 Sheets("date").Cells(row, 5).Value = Range("B6").Value row = WorksheetFunction.CountA(Sheets("date").Columns(6)) + 1 Sheets("date").Cells(row, 6).Value = Range("B7").Value Sheets("統制入力").Select Range("B17").Select ActiveWindow.SmallScroll Down:=-9 Range("B3:B7").Select Selection.ClearContents Range("B1").Select End Sub

専門家に質問してみよう