napisał: popbart postów: 56
umieszczony: 12 stycznia 2007 13:07
|
|
Próbowałem dostać się do schowka z poziomu Accessa, ale z mizernym skutkiem.
Czy ktoś ma na tym polu doświadczenie? |
|
napisał: Trebor postów: 1209
umieszczony: 8 stycznia 2007 16:55
|
|
W moim przypadku dla liczby 98.3 Twój kod wkleja właściwą liczbę ale ignoruje formatowanie w excelu (ilość miejsc po przecinku). Mam ustawiony separator części ułamkowej na kropkę.
Natomiast dla liczby 98,30000 czego mój excel nie rozpoznaje jako liczby Twój kod wkleja 9 830 000.
Przy linii
ActiveCell.Offset(a, b) = Mid(Replace(x.GetText, ",", "."), gdzie, ileEnter - gdzie)
Wkleja prawie dobrze (bez zer na końcu) ale to już można załatwić fomatowaniem.
Podobnie wychodzi przy linii
ActiveCell.Offset(a, b) = CDbl(Mid(x.GetText, gdzie, ileEnter - gdzie))
Pozdrawiam |
|
napisał: shan postów: 5
umieszczony: 8 stycznia 2007 13:35
|
|
Wielkie dzięki, Trebor.
Pobawiłem się trochę Twoim kodem i zmieniłem na ten poniżej.
Jeżeli kopiuje się obszar w Excelu, to ten kod wkleja go wartość po wartości w takim samym układzie komórek, jak w kopiowanym źródle (z uwzględnieniem pustych komórek) - przynajmniej moje dotychczasowe testy tak pokazują.
Zrobiłem sobie też test kopiując 3 rekordy z tabeli w Accessie. Normalnie Excel wkleja nagłówek plus trzy skopiowane rekordy, ten kod wkleił nagłówek i dwa rekordy (mnie interesuje kopiowanie Excel-Excel, więc na razie nie badam w tamtym kierunku).
Widzę jeszcze minusy, nad którymi będę dalej pracował - jeżeli wpiszemy w Excelu 98,3 i sformatujemy tak, aby pokazywał 5 miejsc po przecinku, to skopiowanie i wklejenie pokazuje 9830000 - tak jakby połykał przecinek. Dziwne o tyle, że sformatowanie do 2 miejsc po przecinku wkleja stringa '98,30'...
Sub PasteFormula()
On Error Resume Next
Dim x As New DataObject
x.GetFromClipboard
a = 0 'offset po wierszu
b = -1 'offset po kolumnie
Do
b = b + 1
gdzie = ileTab + 1
ileTab = InStr(gdzie, x.GetText, Chr(9))
ileEnter = InStr(gdzie, x.GetText, Chr(13))
If ileTab = 0 Or ileEnter < ileTab Then
ActiveCell.Offset(a, b) = Mid(x.GetText, gdzie, ileEnter - gdzie)
a = a + 1
b = -1
ileTab = ileEnter + 1
Else
ActiveCell.Offset(a, b) = Mid(x.GetText, gdzie, ileTab - gdzie)
End If
If ileEnter = 0 Then Exit Sub
Loop
End Sub |
|
napisał: Trebor postów: 1209
umieszczony: 5 stycznia 2007 19:18
|
|
Obszar dla mnie mało znany, ale że wątek już co nieco opadł a jestem ciekaw rozwiązania to zaproponuję coś takiego.
Wenę do tego zaczerpnąłem z tej strony http://www.cpearson.com/excel/clipboar.htm
Wymagana referencja do Microsoft Forms 2.0
Sub PasteFormula()
On Error Resume Next
Dim x As New DataObject
x.GetFromClipboard
a = -1
Do
a = a + 1
gdzie = ile + 1
ile = InStr(gdzie, x.GetText, Chr(13))
If gdzie = 1 Then gdzie = 0
If ile = 0 Then ActiveCell.Offset(a, 0) = Mid(x.GetText, gdzie + 1, 1000): Exit Sub
ActiveCell.Offset(a, 0) = Mid(x.GetText, gdzie + 1, ile - gdzie - 1)
Loop
End Sub
Nie bawiłem się tu w szczególną poprawność kodu, ponieważ posiada on braki. Zakładam że dane są już w schowku. Jeśli ich źródłem jest inna aplikacja to wszystko działa tak jak założyłem. Natomiast jeśli kopiuję z excela to należy wywołać schowek ( dwa razy Ctrl+c) i kliknąc na odpowiednią pozycję ze schowka i dopiero uruchomić kod. Oczywiście jeśli kopiowanie jest w makrze wszystko przebiega prawidłowo.
Pozdrawiam |
|
napisał: shan postów: 5
umieszczony: 5 stycznia 2007 00:51
|
|
Hej,
Niestety potrzebuję uzyskać taki efekt bez wklejania tego gdzieś pośrednio, bo to nie ja mam z tego docelowo korzystać, tylko różni ludzie.
To wklejanie wartości komórka po komórce jest mi potrzebne, bo chcę dopisać kod do działającej już aplikacji. W tej aplikacji wklejenie jednej komórki jako wartość daje taki rezultat, jakbym chciał, ale jak wklejam już obszar (np dwie komórki) to efekt jest inny, dlatego chciałem zrobić eksperyment z zasymulowaniem wklejania po jednej wartości. Liczę, że wtedy zadziała.
Widzę, że wcześniej nie napisałem, więc dla ścisłości pracuję w MS Excel 2003.
Jarek |
|
napisał: shan postów: 5
umieszczony: 4 stycznia 2007 21:52
|
|
Witam wszystkich,
Mam problem, z którym nie umiem sobie poradzić mimo wsparcia googla. Potrzebuję się dowiedzieć, jak odwołać się do komórek znajdujących się w schowku/buforze (nie wiem jak to fachowo się nazywa). Chcę się dowiedzieć, bo potrzebuję napisać makro, które przy wklejaniu skopiowanego gdzieś indziej zestawu komórek spowoduje wklejenie ich w moim skoroszycie jako wartości, ale komórka po komórce (nie całość naraz, jak dzieje się to w przypadku 'paste special' -> 'values'). Podejrzewam, że takie skopiowane komórki to obiekt typu 'range'. Jeśli wiedziałbym jak się do niego odwołać, z resztą kodu powinienem sobie poradzić.
Pozdrawiam, Jarek |
|
 wstecz 1 dalej  wszystkich stron: 1
|
|